hdu-2553 N皇後問題
阿新 • • 發佈:2018-08-19
cst check clas sum for dfs esp tput sin 在N*N的方格棋盤放置了N個皇後,使得它們不相互攻擊(即任意2個皇後不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的N,求出有多少種合法的放置方法。
你的任務是,對於給定的N,求出有多少種合法的放置方法。
Input共有若幹行,每行一個正整數N≤10,表示棋盤和皇後的數量;如果N=0,表示結束。Output共有若幹行,每行一個正整數,表示對應輸入行的皇後的不同放置數量。Sample Input
1 8 5 0
Sample Output
1 92 10
題解:可以說是入門的dfs了,直接用數組的i來儲存行就不用考慮行的重復了, 只需要進行對列和對角線的判斷就好了,先打個表,不然可能會超時哦
#include<iostream> #include<algorithm> #include<cstring> #include<sstream> #include<cmath> #include<cstdlib> #include<queue> using namespace std; #define PI 3.14159265358979323846264338327950 int map[12],a[12],n,sum; int check(int x) { for(int i=0;i<x;i++) { if(map[i]==map[x]||abs(map[i]-map[x])==abs(i-x))return 0; } return 1; } void dfs(int x) { if(x==n) sum++; else { for(int j=1;j<=n;j++) { map[x]=j; if(check(x)) dfs(x+1); } } } int main() { for(int i=1;i<11;i++) { sum=0; n=i; dfs(0); a[i]=sum; } int n; while(scanf("%d",&n) && n) { printf("%d\n",a[n]); } }
hdu-2553 N皇後問題