题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2553
N皇后问题是搜索中的经典问题,在N*N的棋盘上放N个皇后,使得每行每列每条对角线上没有两个棋子。
#include <iostream> using namespace std; int visit[11]; //记录行是否有遍历过 int line_map[11]; //记录每行,占的列位置 int count; void dfs(int k ,int n) { int flag = 0; if(k == n+1) { count++; return ; } for(int j=1;j<=n;j++) { if(visit[j]==0) //not visit;make sure the two point will not in direct line { line_map[k] = j; flag = 0; for(int i = 1; i<k ;i++) //循环前k-1个是否有违反规则的 { if(abs(line_map[k]-line_map[i]) == abs(k-i)) //是否在一条斜线上 { flag = 1; break; } } if(flag ==0) { visit[j] = 1; dfs(k+1,n); visit[j] = 0; //回溯 } } } } int main() { int i,j,n; int ans[11]; for(i =1 ;i<11;i++) { memset(visit,0,sizeof(visit)); memset(line_map,0,sizeof(line_map)); count = 0; dfs(1,i); ans[i] = count; } while(scanf("%d",&n),n) { printf("%d\n",ans[n]); } return 0; }