1. 程式人生 > >HDU 2553 狀態壓縮

HDU 2553 狀態壓縮

ava 輸入 output 正整數 inpu new 不同 線上 %d

N皇後問題

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 23888 Accepted Submission(s): 10639


Problem Description 在N*N的方格棋盤放置了N個皇後,使得它們不相互攻擊(即任意2個皇後不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的N,求出有多少種合法的放置方法。

Input 共有若幹行,每行一個正整數N≤10,表示棋盤和皇後的數量;如果N=0,表示結束。

Output 共有若幹行,每行一個正整數,表示對應輸入行的皇後的不同放置數量。

Sample Input 1 8 5 0

Sample Output 1 92 10

Author cgf

Source 2008 HZNU Programming Contest 入門級搜索N皇後,不打表TLE無疑,最近學了狀態壓縮模仿著寫了下,太神奇了這種操作! 唯一的缺點恐怕就是可讀性太差= =但是位運算真的很快,強! #include<bits/stdc++.h>
using namespace std;
int high,ans;
void dfs(int col,int z1,int z2) //列 主對角線 副對角線
{
if(col==high) {ans++;return;} //列滿了說明放滿了,方案加一
int can=(high&~(col|z1|z2)); //得到的數二進制中為1得位表示當前可放置(與high是為了防止越界,int只有32位爆了就不好玩了= =,超出棋盤的位置不必考慮)
while(can){ //只要還有可能的位置能放就繼續
int cur=(can)&((~can)+1); //得到可放置的位置中最低的一位
can=(can&(~cur)); //將這一位從所有的可能中去除
dfs(col|cur,(z1|cur)>>1,(z2|cur)<<1); //遞歸,算上這一位後的各個放置情況
}
}
int main()
{
int N,M,i,j,k;
while(scanf("%d",&N)!=EOF&&N){
ans=0;
high=((1<<N)-1);
dfs(0,0,0);
printf("%d\n",ans);
}
return 0;
}

HDU 2553 狀態壓縮