您的位置:首页 > 其它

HDU ACM 2553 N皇后问题(深搜DFS)

2012-08-26 19:55 381 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2553

用暴力的方法 , 二维数组米字型标记

注意:标记恢复时会有重复的标记,所以标记时不能用used[x][y] == 1 要用 used[x][y]++

即使只有1~10,10种数据但是这题输入的数据也非常多 所以要把数据用数组保存起来.

View Code

#include <iostream>
using namespace std;
const int MAX = 10 + 5;
int used[MAX][MAX];
int num;
int q;
void DFS(int n)
{
if(n - q == 1)
{
num++;
return;
}
int i;
int j;
int k;
for(i=1;i<=q;i++)
{
if(used
[i] == 0)
{
for(j=n;j<=q;j++)
{
used[j][i]++;
}
for(j=1;1;j++)
{
if(n+j <= q)
{
if(i+j <= q)
{
used[n+j][i+j]++;
}
if(i-j > 0)
{
used[n+j][i-j]++;
}
}
else
{
break;
}
}
DFS(n+1);
for(j=n;j<=q;j++)
{
used[j][i]--;
}
for(j=1;1;j++)
{
if(n+j <= q)
{
if(i+j <= q)
{
used[n+j][i+j]--;
}
if(i-j > 0)
{
used[n+j][i-j]--;
}
}
else
{
break;
}
}
}
}
return;
}
int main()
{
int mark[11];
int i;
for(i=1;i<11;i++)
{
q = i;
memset(used,0,sizeof(used));
num = 0;
DFS(1);
mark[i] = num;
}
while(cin>>q,q)
{

cout<<mark[q]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: