在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。Output共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。Sample Input
1 8 5 0
Sample Output
1 92 10
N皇后问题在DFS的题目中应该是比较常见的 思路: 有N个皇后 N行N列的表格 所以每个皇后要占据一行 所以 第i个皇后就是第i行 因此我们只要记录皇后所在的列就可以啦!至于判断是否在对角线上,可以用abs(mark[i]-mark[x])==abs(i-x)就是判断斜率是否等于1;
#include<iostream> #include<math.h> #include<cstring> using namespace std; int n; int mark[15];//保存皇后在的每一列 int ans; int arr[11]; int check(int x){ for(int i=1;i<x;i++) { if(abs(mark[i]-mark[x])==abs(i-x)||mark[i]==mark[x]) return 0; } return 1; } void dfs(int x){ if(x>n){ ans++; return ; } for(int i=1;i<=n;i++){ mark[x]=i; if(check(x)){ dfs(x+1); } } } int main() { for(int i=1;i<=10;i++){ // memset(mark,0,sizeof(mark)); ans=0; n=i; dfs(1); arr[i]=ans; }//打表,,不然会TLE while(cin>>n&&n){ cout<<arr[n]<<endl; } return 0; }