您的位置:首页 > 其它

N皇后问题 深搜-dfs

2013-05-29 19:16 513 查看
题目地址: 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
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: