1 条题解

  • 0
    @ 2025-4-17 15:19:47

    题意:给出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
    上传者