在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
1 8 5 0
1 9210
思路 :只要三个数组,一个标记列,一个标记左对角线,一个标记右对角线,在方阵中,每条对角线要么行加列是定值,要么行减列是定值,那么dfs每一行就能出结果了。另外因为一共就是个数据,但查询量确实很大,所以先打表。
#include<cstdio> #include<queue> #include<cmath> #include<map> #include<cstring> #include<climits> #include<iostream> using namespace std; int mk[4][25]; int ans[15]; int num; void dfs(int cur,int n) { if(cur == n) { num++; return; } for(int i = 0; i < n; i++) { if(!mk[0][i] && !mk[1][cur+i] && !mk[2][cur-i+n]) { mk[0][i] = mk[1][cur+i] = mk[2][cur-i+n] = 1; dfs(cur+1,n); mk[0][i] = mk[1][cur+i] = mk[2][cur-i+n] = 0; } } } int main() { for(int i = 1; i <= 10; i++) { memset(mk,0,sizeof(mk)); num = 0; dfs(0,i); ans[i] = num; } int n; while(scanf("%d",&n)&&n) { cout << ans[n] <<endl; } return 0; }