您的位置:首页 > 其它

hdu 4528——小明系列故事——捉迷藏

2013-09-29 00:24 417 查看
bfs

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct Node
{
int x,y;
int t;
int flag1,flag2;
Node(int xx,int yy,int tt,int ff1,int ff2)
{
x=xx;
y=yy;
t=tt;
flag1=ff1;
flag2=ff2;
}
};
int n,m,T;
int x,y;
char mat[110][110];
int vis[110][110][2][2],vis1[110][110],vis2[110][110];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
void print()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<vis1[i][j]<<" ";
cout<<endl;
}
cout<<endl;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<vis2[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}

void init()
{
int flag1=1,flag2=1,flag3=1;
for(int i=0;i<n&&(flag1||flag2||flag3);i++)
for(int j=0;j<m&&(flag1||flag2||flag3);j++)
{
if(mat[i][j]=='S')
{
x=i,y=j;
flag1=0;
}

if(mat[i][j]=='D')
{
flag2=0;
vis1[i][j]=1;
for(int d=0;d<4;d++)
{
int tx=i;
int ty=j;
while(1)
{
tx+=dir[d][0];
ty+=dir[d][1];
if(tx>=0&&tx<n&&ty>=0&&ty<m&&(mat[tx][ty]=='.'||mat[tx][ty]=='S'))
vis1[tx][ty]=1;
else
break;
}

}
}
if(mat[i][j]=='E')
{
flag3=0;
vis2[i][j]=1;
for(int d=0;d<4;d++)
{
int tx=i;
int ty=j;
while(1)
{
tx+=dir[d][0];
ty+=dir[d][1];
if(tx>=0&&tx<n&&ty>=0&&ty<m&&(mat[tx][ty]=='.'||mat[tx][ty]=='S'))
vis2[tx][ty]=1;
else
break;
}
}
}
}
}
int bfs()
{
queue<Node> q;
q.push(Node(x,y,0,vis1[x][y],vis2[x][y]));
vis[x][y][vis1[x][y]][vis2[x][y]]=1;
if(vis1[x][y]&&vis2[x][y])
return 0;
while(!q.empty())
{
Node t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int tx=t.x+dir[i][0];
int ty=t.y+dir[i][1];
if(tx>=0&&tx<n&&ty>=0&&ty<m&&mat[tx][ty]=='.'&&!vis[tx][ty][t.flag1][t.flag2])
{
vis[tx][ty][t.flag1][t.flag2]=1;
q.push(Node(tx,ty,t.t+1,t.flag1|vis1[tx][ty],t.flag2|vis2[tx][ty]));
if(t.t+1>T)
return -1;
if((t.flag1|vis1[tx][ty])&&(t.flag2|vis2[tx][ty]))
return t.t+1;
}
}
}
return -1;
}
int main()
{
int t;
int cas=1;
cin>>t;
while(t--)
{
cin>>n>>m>>T;
for(int i=0;i<n;i++)
scanf("%s",mat[i]);
memset(vis,0,sizeof(vis));
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
init();
//print();
printf("Case %d:\n",cas++);
cout<<bfs()<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: