您的位置:首页 > 其它

hdu 1045 Fire Net

2015-03-25 20:34 253 查看
由于数据量比较小,所以呢.............暴力搜索!

把除去x的每个点都作为搜索的起始点,进去搜索。

搜索过程中,一个一个的去找没有被标记过且不为x的点,然后把这个点和前面所有的点进行比较判断,再dfs下去...........

看到学长只有50行的代码再次感觉自己弱爆了

#include<iostream>
using namespace std;
char mapp[5][5];
int re,n;
int testa(int x,int y,int z)//同行的2个点看有没有墙
{
if(y>z) swap(y,z);
int flag=1;
for(int i=y+1;i<=z-1;i++)
{
if(mapp[x][i]=='X')
{
flag=0;break;
}
}
return flag;
}
int testb(int x,int y,int z)//同列的两个点看有没有墙
{
if(y>z) swap(y,z);
int flag=1;
for(int i=y+1;i<=z-1;i++)
{
if(mapp[i][x]=='X')
{
flag=0;break;
}
}
return flag;
}
int jduge(int x,int y)//是否和前面所有的点有冲突
{
int flag=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(mapp[i][j]==1)
{
if(i==x&&testa(i,j,y)) flag=0;
if(j==y&&testb(y,i,x)) flag=0;
}
}
}
return flag;
}
void dfs(int x,int y,int t)
{
t++;
mapp[x][y]=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(mapp[i][j]=='.'&&jduge(i,j)) dfs(i,j,t);
}
}
mapp[x][y]='.';
re=max(t,re);
}
int main()
{
while(cin>>n&&n)
{
int x,y;
re=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>mapp[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(mapp[i][j]=='.') dfs(i,j,0);
}
}
cout<<re<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: