n皇后問題
problem description
在n*n的方格棋盤放置了n個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的n,求出有多少種合法的放置方法。
input
共有若干行,每行乙個正整數n≤10,表示棋盤和皇后的數量;如果n=0,表示結束。
output
共有若干行,每行乙個正整數,表示對應輸入行的皇后的不同放置數量。
sample input
1850
sample output
19210
分析:題目意思就是在某一行的某一列放置乙個皇后,然後在他的同一行,同一列以及45°對角線都不能放置皇后,求存在多少種放置方案。所以的話,我的思路就是用從第一行開始遍歷,用乙個陣列id[i]表示第i行的皇后放置在哪一列。由於我是按行遍歷的,因此在考慮當前行當前列是否可以放置的時候,只需要考慮是否同一列或者在45°對角線上,同一列的問題,可以考慮cur行之前的放置情況,用id[cur]與id[i]來判斷,cur表示當前行;對角線的問題,很容易可以發現,判斷它們斜率的絕對值是否等於1(紫書上也有一種判斷方法,菜鳥沒看懂,只能用自己的方法來判斷),如果可以放置,則進行cur+1行的操作,直到n-1行,否則考慮另一列。判斷一套方案是否成立的條件是cur==n。下面**用了預處理的方法~
下面上**:
#include#include#include#includeusing namespace std;
int id[12];
int n;
int count1;
int a[12];
void dfs(int cur,int t)
else
}if(flag==1)
dfs(cur+1,t);}}
}int main()
while(~scanf("%d",&n)&&n)
return 0;
}
HDU 2553 N皇后問題
題目 problem description 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數...
HDU 2553 N皇后問題
復健。一題經典的回溯法,要打表。include define max n 11 int n,res int c max n ans max n void dfs int cur if flag dfs cur 1 int main int m while scanf d m m printf d n...
HDU 2553 N皇后問題
題目資訊 一種非常有用的二進位制優化方法 hdu2553n皇后問題 problem description 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。in...