1 条题解
-
0
题意:给出n行m列地图,起点坐标sx,sy,终点坐标,ex,ey,和起始时机器人所朝向的方向sdir 下列情况算走1步: 1.向前移动:沿着一个方向走1,2或3个格子,算1步; 2.转向:向左转或者向右转,算1步。 另外需要注意的是机器人有他的半径,(好像是)0.8m,格子边长是1m。
解题思路:BFS。 这道题的判断条件很重要,理一理大概有以下几点: 1.方向与坐标应该对应正确,在输入时可以直接处理下初始方向,用0,1,2,3对应。
2.判断下一个格子是不能只判断单独一个格子,而是要把周围四个格子都判断下,因为机器人有半径,判断能不能放得下他;
3.在进行下一步时有两种情况,一是移动,二是转向。移动和转向需要分开写,互不影响;
4.在移动的情况下,如果移动1个格子行不通则直接break,第1个格子不行就算第2个格子或第3个格子符合条件也不能走。(通常情况下对于不符合条件的都是continue。此处用break可以避免很多麻烦)。
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; int n,m,ex,ey; int mp[110][110],book[110][110][4]; int nx[4][2]={-1,0,0,1,1,0,0,-1};//北(上)0东(右)1南(下)2西(左)3 struct node { int x,y,time,dir; }; node getnode(int x,int y,int time,int dir) { node q; q.x=x; q.y=y; q.time=time; q.dir=dir; return q; } void bfs(int x,int y,int time,int dir) { queue<node> q; q.push(getnode(x,y,time,dir)); while(!q.empty()) { int tx=q.front().x; int ty=q.front().y; for(int i=1;i<4;i++)//123步 { tx+=nx[q.front().dir][0]; ty+=nx[q.front().dir][1]; //一定要是break,走1步走不通就不再继续2,3步了,还要注意下个格子能不能走下机器人 if(tx<1||tx>=n||ty<1||ty>=m||mp[tx][ty]||mp[tx+1][ty]||mp[tx][ty+1]||mp[tx+1][ty+1]) break; if(book[tx][ty][q.front().dir]==0) { book[tx][ty][q.front().dir]=1; if(tx==ex&&ty==ey) { printf("%d\n",q.front().time+1); return; } q.push(getnode(tx,ty,q.front().time+1,q.front().dir)); } } for(int i=0;i<4;i++) { if(abs(q.front().dir-i)==2) continue;//就是从上一步走过来的就别往回走了 if(book[q.front().x][q.front().y][i]==0)//原地转向不需要判断边界 { book[q.front().x][q.front().y][i]=1; q.push(getnode(q.front().x,q.front().y,q.front().time+1,i)); } } q.pop(); } printf("-1\n"); } int main() { while(~scanf("%d%d",&n,&m)&&n+m) { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&mp[i][j]); } } int sx,sy,sdir; char str[10]; scanf("%d%d%d%d%s",&sx,&sy,&ex,&ey,str); if(str[0]=='n') sdir=0; if(str[0]=='e') sdir=1; if(str[0]=='s') sdir=2; if(str[0]=='w') sdir=3; if(sx==ex&&sy==ey) { printf("0\n"); continue; } memset(book,0,sizeof(book)); book[sx][sy][sdir]=1; bfs(sx,sy,0,sdir); } return 0; }
- 1
信息
- ID
- 377
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者