在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。Output共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。Sample Input
1 8 5 0
Sample Output
1 92 10
#include <cstdio> #include <iostream> #include <cmath> #include <algorithm> #include <cstring> using namespace std; #define ll long long int n, position[18], line[18], sum, r; bool compare(int miao) { for(int i = 1; i<miao; i++)//一行一行来判断,如果写线上有相同的或者同一列上有相同的,那就是错的 if((abs(miao - i) == abs(line[miao]-line[i])) || line[miao] == line[i]) return 0; return 1; } int queen(int t) { if(t>r) sum++; else for(int i = 1; i <= r; i++)//一列一列的查找 { line[t] = i;//第t行的第i列 if(compare(t))queen(t+1);//如果在t阶矩阵下能进行排列,那就开始尝试t+1阶矩阵 } return sum; } int main() { memset(line, 0, sizeof(line)); for(r= 1; r<11; r++)//在输入之前,先把所有的数存起来,解决时间。r为r阶矩阵下的n皇后 { sum = 0;//每次都使sum = 0是为了在每次查r阶矩阵的时候,结果不会重复 position[r] = queen(1);//一行一行的查找,先从第一行开始查找 } while(~scanf("%d", &n) && n) { printf("%d ", position[n]); } return 0; }