您的位置:首页 > 其它

[HDU] 2553 N皇后问题-简单深搜

2013-04-16 17:58 344 查看
题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2553

方法: 1.可以用对称的思想,即:如果N是偶数,则只计算第一个皇后分别放在第一行的位置1到N/2这N/2个情况的结果和,最后再乘以2。如果是奇数,再单独计算一个在N/2+1这个位置的结果。

    2.一个皇后如果放在一个位置,要把该位置对应的行列上的位置和以该位置为起点,从左下 和 右下45读的两个方向延伸穿过的位置都设置为不可再放。

3.在状态数中,在第i层为第i个皇后找位子其实就是在棋盘的第i行找。找不到就返回,否则修改棋盘,继续收索,直到第N层也搜索成功,此时给结果加1.

感想:后期多看。

代码:

View Code

#include<iostream>
#include<math.h>
#include <algorithm>
using namespace std;
int n;
int table[11];
struct Record
{
int row;
int col;
};
bool canPlace[11][11];
int total_sum=0;
void usedPlace(int x,int y)
{
for(int i=x,j=y;i<=n&&j<=n;i++,j++)
canPlace[i][j]=false;
for(int i=x,j=y;i<=n &&j>=1;i++,j--)
canPlace[i][j]=false;
for(int i =x;i<=n;i++)
canPlace[i][y]=false;
}

void DFSSearch( int start = 1)
{
if(start==n)
{
total_sum++;
return;
}
bool t_canPlace[11][11];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t_canPlace[i][j] =  canPlace[i][j];
for(int i=1;i<=n;i++)
{
if(canPlace[start+1][i])
{
usedPlace(start+1,i);
DFSSearch(start+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
canPlace[i][j] =  t_canPlace[i][j];
}
}
}
int main()
{
memset(table,-1,sizeof(table));
while(scanf("%d",&n)&& n!=0)
{
int sum=0;
if(table
==-1)
{
int boundary = n/2;
total_sum=0;
for(int i=1;i<=boundary;i++)
{
memset(canPlace,true,sizeof(canPlace));
usedPlace(1,i);
DFSSearch();
}
sum+=total_sum*2;
if(n%2!=0)
{
total_sum=0;
memset(canPlace,true,sizeof(canPlace));
usedPlace(1,boundary+1);
DFSSearch();
sum+=total_sum;
}
table
=sum;
}
else
sum = table
;
cout<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: