您的位置:首页 > 其它

HDU-2102 A计划

2015-09-26 00:04 281 查看

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=2102

题意:

从S搜索到E有两张图,#处可以转换到另一张图,求是否能在T时间内走到。

思路:

就是基础的搜图,只是加了个两张图之间跳转罢了。

代码:

#define N 112

int n,m;
int flag,sum,ave,ans,res,len,ans1,ans2;
int g[2]

,dir[4][2]={1,0,-1,0,0,1,0,-1};
char s[101];
struct node
{
int x,y,z,step;
}tn,e;
bool bfs()
{
queue<node>q;
while(!q.empty())q.pop();
node a,b;
tn.step=0;
q.push(tn);
while(!q.empty())
{
a=q.front();q.pop();
if(a.x==e.x&&a.y==e.y&&a.z==e.z)
return true;
if(a.step==sum)continue;
for(int i=0;i<4;i++)
{
b=a;b.x+=dir[i][0];b.y+=dir[i][1];b.step++;
if(g[b.z][b.x][b.y]==2)b.z^=1;
if(g[b.z][b.x][b.y]==1)
{
g[b.z][b.x][b.y]=0;
q.push(b);
}
}
}
return false;
}
int main()
{
int i,j,k,kk,t,x,y,z;
scanf("%d",&kk);
while(kk--)
{
scanf("%d%d%d",&n,&m,&sum);
memset(g,0,sizeof(g));
for(k=0;k<2;k++)
for(i=0;i<n;i++)
{
scanf("%s",s);
for(j=0;j<m;j++)
{
if(s[j]=='*')continue;
if(s[j]=='S')
tn.x=i+1,tn.y=j+1,tn.z=k;
g[k][i+1][j+1]=1;
if(s[j]=='P')
e.x=i+1,e.y=j+1,e.z=k;
if(s[j]=='#')
g[k][i+1][j+1]=2;
}
}
printf("%s\n",bfs()?"YES":"NO");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: