hdu2553八皇后問題(DFS)
阿新 • • 發佈:2019-01-31
在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的N,求出有多少種合法的放置方法。
Input共有若干行,每行一個正整數N≤10,表示棋盤和皇后的數量;如果N=0,表示結束。Output共有若干行,每行一個正整數,表示對應輸入行的皇后的不同放置數量。Sample Input
1 1
你的任務是,對於給定的N,求出有多少種合法的放置方法。
Input共有若干行,每行一個正整數N≤10,表示棋盤和皇后的數量;如果N=0,表示結束。Output共有若干行,每行一個正整數,表示對應輸入行的皇后的不同放置數量。Sample Input
1 8 5 0Sample Output
1 92 10DFS搜尋題
打表防止超時!
程式碼
/*#include<iostream> using namespace std; long long ans[12]; //打表儲存答案 long long cnt; int vis[12][12]; //這個就是棋盤了,等於0就是沒放棋子,等於1就是放了 bool check(int r,int c) //判斷能不能放 { for(int i=1;i<r;i++) //因為是一行一行遞迴過來的,所以只要檢查這一列有沒有 if(vis[i][c]) return false; for(int i=c,j=r;i<=10&&j>=1;i++,j--) //對角線 if(vis[j][i]) return false; for(int i=c,j=r;i>=1&&j>=1;i--,j--) //對角線 if(vis[j][i]) return false; return true; } void trial(int i,int n) //表示此時已經在前i-1行放了棋子了,總共有n*n的棋盤 { if(i>n) //說明已經放了n個棋子了 cnt++; else //咱接著放 for(int j=1;j<=n;j++) if(check(i,j)) { vis[i][j]=1; //放下去就標記 trial(i+1,n); vis[i][j]=0; //拿起來就取消標記,還原現場 } } void f() //開開心心算完結果 { for(int i=1;i<11;i++) { cnt=0; trial(1,i); ans[i]=cnt; } } int main() { int N; f(); while(cin>>N&&N) { cout<<ans[N]<<endl; } return 0; }
1 1
2 0
3 0
4 2
5 10
6 4
7 40
8 92
9 352
10 724
*/