C - N皇后问题(搜索)
Description
在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
建立一个n行n列的矩阵,矩阵中能放n个皇后,任意两个皇后不能再同一行或者同一列,任意两个皇后的连线不能与边界成∠45°
问有多少种排列方法
分析:根据要求可以推出每一行每一列都至少有一个皇后
用搜索寻找第x行的皇后放在哪一列上了,标记上这个位置,同时把其他不能放的位置也都标记下
最后一行找完之后进入第dfs(n+1),这个时候方法数加一
代码:
/* 注意:1:写死循环要么注意跳出条件,要么就别写 2: 复制粘贴的前面用的代码的时候一定记得把所有需要修改的条件都改了 */ #include <stdio.h> #include <string.h> using namespace std; int cnt, n; int vis[11][11]; void dfs(int x) { if(x == n+1) { cnt++; return; } for(int i = 1; i <= n; i++) //////////////////////////////////////// { if(!vis[x][i]) { for(int j = x; j <= n; j++) { vis[j][i]++; } for(int j = 1; 1; j++) { if(x+j <= n) { if(i+j <= n) vis[x+j][i+j]++; if(i - j >= 1) vis[x+j][i-j]++; } else break;////////////////////////////////////////////////////// } dfs(x+1); for(int j = x; j <= n; j++) vis[j][i]--; for(int j = 1; 1; j++) { if(x+j <= n) { if(i+j <= n) vis[x+j][i+j]--; if(i - j >= 1) vis[x+j][i-j]--; } else break;///////////////////////////////////////////////////////////////// } } } } int main() { int ans[11], i; memset(ans, 0, sizeof(ans)); for(i = 1; i <= 10; i++) { n = i; cnt = 0; memset(vis, 0, sizeof(vis)); dfs(1); ans[i] = cnt; //printf("ans[%d] = %d\n", i, ans[i]); } while(scanf("%d", &n), n) printf("%d\n", ans[n]); return 0; }