标签:
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13282 Accepted Submission(s): 3278
1 5 5 14 S*#*. .#... ..... ****. ...#. ..*.P #.*.. ***.. ...*. *.#..
YES
//这道题整整花了我一天的时间!就是找不到错误,最终找到了三处错误的地方,在下面都标记过了
/*
这道题的思路和其他的广搜题大体一样,唯一的不同就是在上下的方向上有限制,所以你要在遇到#的 时候
要另外讨论是上,还是下,还是死路一条,所以,在解这道题的时候,就只分前后左右就行了,在上下的
时候应该在前后左右移动之前就得判断是否能上下,能上下移动的条件是所在的位置是#,并且#上面(或下面)
的位置是点(.),并且之前没有走过这个位置!然后当你移动过之后,你应该将矛头转向移动过之后的点
在它周围找终点;需要注意的是:当#上面(或者下面)是#或者是*号的时候,就只能思路一条了!也有可能就是终点
,你就到终点了!
*/
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#define INF 0xfffffff
using namespace std;
int n,m,t;
char map[2][11][11];//
int dx[4]={0,1,-1,0};
int dy[4]={1,0,0,-1};
int ex,ey,ez;
int ans,flag;
int vis[2][11][11];//
struct node
{
int x,y,z,step;
friend bool operator < (node a,node b)
{
return a.step>b.step;
}
}a,temp;
int judge()
{
if(temp.x<0||temp.x>=n) return 0;
if(temp.y<0||temp.y>=m) return 0;
if(map[temp.z][temp.x][temp.y]=='*') return 0;//
if(vis[temp.z][temp.x][temp.y]==1) return 0;//
if(temp.step>=ans) return 0;//可以写成》=ans了,但是有规定的时间了!当时间大于规定时间的话,这条路就也不符合规定的路了
return 1;
}
void bfs()
{
a.x=0;
a.y=0;
a.z=0;
a.step=0;
priority_queue<node>q;
q.push(a);
memset(vis,0,sizeof(vis));
vis[0][0][0]=1;//
while(!q.empty())
{
a=q.top();
q.pop();
if(map[a.z][a.x][a.y]=='#')
{
temp.x=a.x;
temp.y=a.y;
if(a.z==0)
{
temp.z=a.z+1;
}
else if(a.z==1)
{
temp.z=a.z-1;
}
if(map[temp.z][temp.x][temp.y]=='#'||map[temp.z][temp.x][temp.y]=='*')
{
continue;
}
else if(temp.x==ex&&temp.y==ey&&temp.z==ez)
{
ans=temp.step;
flag=1;
return;
}
else if(map[temp.z][temp.x][temp.y]=='.'&&vis[temp.z][temp.x][temp.y]==0)
{//并且是没有标记的才能走,否则不能走! 错点1
vis[temp.z][temp.x][temp.y]=1;
a=temp;
}
else if(map[temp.z][temp.x][temp.y]=='.'&&vis[temp.z][temp.x][temp.y]==1)
{
continue;
}
}
for(int i=0;i<4;i++)
{
temp.x=a.x+dx[i];
temp.y=a.y+dy[i];
temp.z=a.z;//这一句千万别丢了!wa了N次! 错点2
temp.step=a.step+1;
if(judge())
{
if(temp.x==ex&&temp.y==ey&&temp.z==ez)//
{
ans=temp.step;
flag=1;
return;
}
vis[temp.z][temp.x][temp.y]=1;//
q.push(temp);
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&t);
ans=INF;flag=0;
for(int i=0;i<n;i++)
{
getchar();
for(int j=0;j<m;j++)
{
scanf("%c",&map[0][i][j]);//
if(map[0][i][j]=='P')//
{
ex=i;ey=j;ez=0;
}
}
}
getchar();
for(int i=0;i<n;i++)
{
getchar();
for(int j=0;j<m;j++)
{
scanf("%c",&map[1][i][j]);
if(map[1][i][j]=='P')
{
ex=i;ey=j;ez=1;
}
}
}
bfs();
if(flag==1&&ans<=t)//这个时间能等于!错点3(题上有说明)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/dxx_111/article/details/47375653