zoukankan      html  css  js  c++  java
  • poj 1367 robot(搜索)

    题意:给你一个图,求起点 到 终点的最少时间

    每次有两种选择①:往前走1~3步                ②原地选择90°   费时皆是1s

    图中1为障碍物,而且不能出边界。还要考虑机器人的直径


    思路:

    bfs,但是在判断时出了点问题/(ㄒoㄒ)/,想复杂了,导致一直wr。

    用vis[x][y][dir] 表示状态,即在(x,y)点的dir方向


    问题:

    ①考虑判断条件时出现问题,开始想得太简单,后来想得太复杂= =

    ②最开始写的搜索部分太乱

    ③题意理解不准确。。


    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <queue>
    #include <algorithm>
    typedef long long ll;
    using namespace std;
    
    int tmap[60][60];
    int vis[60][60][5];
    struct node
    {
        int x,y;
        int step;
        int dir;
    };
    int n,m;
    char to[10];
    int fx,fy,tx,ty;
    int dir[5][2] = {{-1,0},{0,1},{1,0},{0,-1}};
    int ans = -1;
    
    bool judge(node a)              //判断当前是否包含了黑点
    {
        if(a.x<1||a.x>=n||a.y<1||a.y>=m)
            return false;
        if(tmap[a.x][a.y]||tmap[a.x+1][a.y]||tmap[a.x][a.y+1]||tmap[a.x+1][a.y+1])
            return false;
        return true;
    }
    
    void bfs()
    {
        queue<node>q;
    
        node cur;
        ans = -1;
        cur.x = fx;
        cur.y = fy;
        cur.step = 0;
    
        if(to[0] == 's') cur.dir = 2;
        if(to[0] == 'n') cur.dir = 0;
        if(to[0] == 'w') cur.dir = 3;
        if(to[0] == 'e') cur.dir = 1;
        vis[cur.x][cur.y][cur.dir] = 1;
        q.push(cur);
        while(!q.empty())
        {
            cur = q.front();
            q.pop();
    //        printf("%d %d %d %d
    ",cur.x,cur.y,cur.dir,cur.step);
            for(int i = 1; i <= 3; i++)
            {
                node t;
                int dr = cur.dir;
                t.dir = cur.dir;
                t.x = cur.x + dir[dr][0]*i;
                t.y = cur.y + dir[dr][1]*i;
                t.step = cur.step+1;
                if(!judge(t))
                    break;
                if(t.x == tx  &&  t.y == ty)
                {
                    ans = t.step;
    //                printf("%d %d %d
    ",t.x,t.y,t.dir);
                    return ;
                }
                if(!vis[t.x][t.y][t.dir])
                {
                    vis[t.x][t.y][t.dir] = 1;
                    q.push(t);
                }
            }
            for(int i = 0; i < 4; i++)
            {
                if(max(i,cur.dir)-min(i,cur.dir) == 2)
                    continue;
                if(vis[cur.x][cur.y][i])
                    continue;
                node t = cur;
                t.dir = i;
                t.step = cur.step+1;
                vis[t.x][t.y][t.dir] = 1;
                q.push(t);
            }
        }
        return ;
    }
    
    int main()
    {
        while(scanf("%d%d",&n,&m) != EOF)
        {
            if(n == 0 && m == 0)
                break;
            memset(vis,0,sizeof(vis));
            for(int i = 1; i <= n; i++)
                for(int j = 1; j <= m; j++)
                {
                    scanf("%d",&tmap[i][j]);
                }
            scanf("%d%d%d%d",&fx,&fy,&tx,&ty);
            scanf("%s",to);
            if(tmap[tx][ty])
            {
                printf("-1
    ");
                continue;
            }
            if(fx == tx && fy == ty)
            {
                printf("0
    ");
                continue;
            }
            bfs();
    
            if(ans == -1)
                printf("-1
    ");
            else
                printf("%d
    ",ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    Android中TextView设置下划线
    BottomSheetDialogFragment 如何设置高度和禁止滑动(Kotlin)
    [iOS]使用GCD创建定时器
    [iOS]定时器NSTimer、CADisplayLink的内存管理
    [iOS]dispatch_after()中self和weakself的使用
    [Flutter]在Mac上安装Flutter运行环境
    wx小程序反编译为js代码
    Android | 玩转AppBarLayout,设置scrollFlags滑动属性详解
    玩转微信 | 炫酷的聊天满屏掉爱心系列,赶紧收藏
    Android使用更简单的方式实现滑块拼图验证码功能
  • 原文地址:https://www.cnblogs.com/Przz/p/5409708.html
Copyright © 2011-2022 走看看