您的位置:首页 > 其它

hdu 2102 A计划

2013-05-05 22:30 393 查看
搜索的题就是要细心

#include<stdio.h>
#include<string.h>
#include<queue>
#define inf 0x3fffffff
using namespace std;
int vis[2][11][11];
char map[2][11][11];
int n,m,T;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
struct op
{
int k,x,y,step;
};
int judge(int k,int x,int y)
{
if(x<0||x>=n||y<0||y>=m||map[k][x][y]=='*')
return 0;
return 1;
}
int bfs()
{
int i,x,y,step,k;
queue<op>Q;
op cur,next;
cur.k=0;
cur.x=0;
cur.y=0;
cur.step=0;
Q.push(cur);
vis[0][0][0]=0;
while(!Q.empty())
{
cur=Q.front();
Q.pop();
if(cur.step>T)continue;
if(map[cur.k][cur.x][cur.y]=='P')
return cur.step;

for(i=0;i<4;i++)
{
x=cur.x+dir[i][0];
y=cur.y+dir[i][1];
k=cur.k;
step=cur.step+1;

if(map[k][x][y]=='#')
{
k=(k+1)%2;
if(map[k][x][y]=='#'||map[k][x][y]=='*')
continue;
}
if(judge(k,x,y)==0)continue;
if(vis[k][x][y]>step)
{
vis[k][x][y]=step;
next.k=k;
next.step=step;
next.x=x;
next.y=y;
Q.push(next);
}
}
}
return -1;
}
int main()
{
int t,i,j,p;
scanf("%d",&t);
while(t--)
{
for(i=0;i<2;i++)
for(j=0;j<11;j++)
for(p=0;p<11;p++)
vis[i][j][p]=inf;
scanf("%d%d%d",&n,&m,&T);
for(i=0;i<n;i++)
scanf("%s",map[0][i]);
for(i=0;i<n;i++)
scanf("%s",map[1][i]);
j=bfs();
if(j==-1)
puts("NO");
else puts("YES");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: