• POJ_1376_bfs


    题目描述:

      给定一个黑白格子的图,黑格子是障碍物,一个线段交点的起点,一个线段交点的终点和初始方向,机器人从起点开始,只能沿着线段,走到终点,期间不能沿着障碍物边缘和墙边缘。

      一次操作可以向当前方向走1-3步或者向左右转身,求最小步数。

    思路:

      由于格子和机器人的线路形式不一样,直接把障碍物转化成不能走的线路,刚开始想dfs,后来发现没法做,只能bfs(凭自己的水平- _ -),记录每次的坐标、方向和操作次数,每个坐标第一次到达的时候必然是次数最少的。另外要注意的是,转头只能左右转,不能向后转,前进的的时候,若当前前进的步数会遇到障碍物,则比这个步数大的步数也必然会遇到障碍物。

      一开始提交的时候,以为可以经过边界,一时WA,然后参考了网上代码之后,修改了这个细节就AC了= =。

    #include<cstdio>
    #include<iostream>
    #include<queue>
    #include<cstring>
    using namespace std;
    
    int a[55][55],vis[55][55][4],move[][2]= {{-1,0},{0,-1},{1,0},{0,1}};
    
    struct robot{
        int x,y,dir,num;
    }start,stop;
    
    int main()
    {
    
        int n,m;
        char s[10];
        while(~scanf("%d%d",&n,&m) && n &&m)
        {
            memset(a,0,sizeof(a));
            memset(vis,0,sizeof(vis));
            int ans = -1;
            for(int i = 1;i <= n;i++)
            {
                for(int j = 1;j <= m;j++)
                {
                    int temp;
                    scanf("%d",&temp);
                    if(temp)
                    {
                        a[i][j] = 1;
                        a[i+1][j] = 1;
                        a[i][j+1] = 1;
                        a[i+1][j+1] = 1;
                    }
                }
            }
            n++;
            m++;
    
            scanf("%d%d%d%d%s",&start.x,&start.y,&stop.x,&stop.y,s);
            start.x++;
            start.y++;
            stop.x++;
            stop.y++;
            switch(s[0])
            {
                case 'n':   start.dir = 0;break;
                case 's':   start.dir = 2;break;
                case 'w':   start.dir = 1;break;
                case 'e':   start.dir = 3;break;
            }
            queue<robot> q;
            start.num = 0;
            q.push(start);
            while(!q.empty())
            {
                robot now = q.front();
                q.pop();
                int xx = now.x,yy = now.y,dirr = now.dir,numm = now.num;
                if(xx == stop.x && yy == stop.y)
                {
                    ans = numm;
                    printf("%d
    ",ans);
                    break;
                }
                if(xx <= 1 || xx >= n || yy <= 1 || yy >= m || vis[xx][yy][dirr] || a[xx][yy])
                {
                    continue;
                }
                for(int i =0;i <= 3;i++)
                {
                     if(i-dirr ==0 || i-dirr == 2 || i- dirr ==-2)
                     {
                         continue;
                     }
                     else
                     {
                         robot temp;
                         temp.x = xx;
                         temp.y = yy;
                         temp.dir = i;
                         temp.num = numm+1;
                         q.push(temp);
                     }
                }
                for(int i = 1;i <= 3;i++)
                {
                    int xxx = xx+move[dirr][0]*i,yyy = yy+move[dirr][1]*i;
                    if (a[xxx][yyy] == 1)
                    {
                        break;
                    }
                    robot temp;
                    temp.x = xxx;
                    temp.y = yyy;
                    temp.dir = dirr;
                    temp.num = numm+1;
                    q.push(temp);
                }
                vis[xx][yy][dirr] = 1;
            }
            if(ans == -1)   printf("-1
    ");
        }
        return 0;
    }
  • 相关阅读:
    格式化日期为yyyy-MM-dd
    JavaScript 原型
    SSD 车辆检测 实现
    Unity模拟自动驾驶方向盘角度预测
    交通标识牌识别
    cifar-10 No such file or directory: '/home/ /.keras/datasets/cifar-10-batches-py/data_batch_1'
    Keras 使用多层感知器 预测泰坦尼克 乘客 生还概率
    else
    Keras源码下载记录
    import cv2 失败 ImportError:DLL load fail:找不到指定模块
  • 原文地址:https://www.cnblogs.com/zhurb/p/5839933.html
Copyright © 2020-2023  润新知