Description
在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
Input
输入的第一个为测试样例的个数T,接下来有T个测试样例。每个测试样例的只有一行一个数n ( n < 15 ),表示棋盘的大小。
Output
对应每个测试样例输出一行结果:可行方案数。
Sample Input
2
3
4
Sample Output
0
2
#include<iostream> #include<string.h> #include<cmath> using namespace std; const int NUM = 16; int x[NUM]; int n; //棋盘的大小 int sum; //当前找到的可行方法数 inline bool place(int t){ for(int i=1;i<t;i++){ if((abs(t-i)==abs(x[i]-x[t]))||(x[i]==x[t])){ return false; } } return true; } void Backtrack(int t){ if(t>n){ sum++; } else{ for(int i=1;i<=n;i++){ x[t]=i; if(place(t)) Backtrack(t+1); } } } int main(){ int T; cin >> T; while(T--){ cin >> n; sum = 0; memset(x,0,sizeof(x)); Backtrack(1); cout << sum <<endl; } }