您的位置:首页 > 其它

HDU-1045-fire net

2012-08-31 09:56 246 查看
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1045

程序分析:

  题目是说在一个特殊的地图里摆设碉堡,限制条件可能跟N皇后又点相似,但是这里有墙,中间隔有墙的话还是不会互相干扰的。只是行列方向会冲突,斜角线不会冲突,。所以我们只有判断所在的行列不会存在冲突的碉堡就行。注意中间可以隔有墙。记住每一次到达最后一个点时的可放碉堡数,比现在保存最大的就替换为最大值。

解决方法:

  深搜回溯,找出每一种方法的最大放置碉堡数,编写一个判断能否放置碉堡的函数,细节看代码。  

View Code

#include<iostream>
#include<string>
using namespace std;

int n, m;
char map[5][5];
int Max;

int pd(int x, int y)
{
for(int i=x-1; i>=0; i--)   //判断此行能否放置碉堡
{
if(map[i][y] == '0')
return 0;
if(map[i][y] == 'X')
break;
}
for(int j=y-1; j>=0; j--)   //判断此行能否放置碉堡
{
if(map[x][j] == '0')
return 0;
if(map[x][j] == 'X')
break;
}
return 1;
}

void DFS(int k, int curmax)
{
int x, y;
if(k == n*n)  //到达最后一个点
{
if(Max < curmax)  //保存这一种方法最多能摆的碉堡数
{
Max = curmax;
return ;
}
}
else
{
x = k/n;
y = k%n;
if(map[x][y]=='.' && pd(x, y)==1) //可以摆放就把个数加一继续找下一个可以摆的地方
{
map[x][y] = '0';
DFS(k+1, curmax+1);
map[x][y] = '.';
}
DFS(k+1, curmax); //不能摆或者回溯回来进行下一个地方的查找
}
}
int main()
{
while(cin>>n && n)
{
for(int i=0; i<n; i++)
{
scanf("%s", map[i]);
}
Max = 0;
DFS(0, 0);
cout<<Max<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: