标签:
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