您的位置:首页 > 其它

zoj 1002 && hdu 1045 Fire Net

2011-08-30 17:42 393 查看
一直都知道这个题目能够用深度优先搜索来做,但是一直没有写过。其实这个题目不是很难,但是好久都没写过搜索了,感觉很吃力了。所以从现在开始想把搜索在好好地搞一下了。题目的大意:给定一个矩阵,这个矩阵中有些地方是空白的,有些地方是有墙的,问最多可以放置多少不互相攻击炮台。
搜索的策略是:从第一个位置开始搜索,搜遍没一个位置,当然有墙和放置了炮台的地方不再可以放置炮台。还有保证不互相攻击...........有些小技巧得好好体会,好好学习了。感觉自己很菜,还得努力啊!

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 6
int t;
int maxs;
char map

;
bool judge(int x,int y)
{
if(map[x][y]!='.')return false;       //表示这个点是无法放置炮台的
for(int i=x-1;i>=1;i--)
{
if(map[i][y]=='X')break;
if(map[i][y]=='P')return false;
}
for(int i=y-1;i>=1;i--)
{
if(map[x][i]=='X')break;
if(map[x][i]=='P')return false;
}
return true;
}
void DFS(int pos,int n)
{
if(pos==t*t)
{
maxs=maxs>n?maxs:n;
return;
}
int x=pos/t+1;   //小技巧,学过来了
int y=pos%t+1;
if(judge(x,y))   //判断坐标为(x,y)的点能否放置炮台
{
map[x][y]='P';
DFS(pos+1,n+1);
map[x][y]='.';
}
DFS(pos+1,n);
return ;
}
int main()
{
while(scanf("%d",&t)!=EOF&&t)
{
for(int i=1;i<=t;i++)
{
for(int j=1;j<=t;j++)
{
cin>>map[i][j];
}
}
maxs=-1;
DFS(0,0);
printf("%d\n",maxs);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: