zoukankan      html  css  js  c++  java
  • POJ1376简单广搜

    题意:
          给你一个n*m的矩阵,然后给你机器人的起点和终点,还有起点的方向,然后每次机器人有两种操作,左右旋转90度,或者是朝着原来的方向走1,2或者3步,机器人再走的过程中不能碰到格子,也不能碰到边界,输出最少步数。


    思路:
         比较简单的题目,只是要注意几点。
    (1)走的过程中边界不可以碰
    (2)如果你想一下子走3步的话,记住路程中不能碰墙
    (3)mark的时候记得也罢方向mark上。
    简单题目,就说这么多吧。




    #include<queue>
    #include<stdio.h>
    #include<string.h>


    using namespace std;


    typedef struct
    {
        int x ,y ,t ,dir;
    }NODE;


    int sx ,sy ,ex ,ey ,n ,m ,sdir;
    int mark[55][55][5];
    int map[55][55];
    NODE xin ,tou;


    bool jude2(int x ,int y)
    {
        return !map[x+1][y] && !map[x][y+1] && !map[x+1][y+1];
    }


    bool ok(int x ,int y ,int dir)
    {
        return x >= 1 && x <= n && y >= 1 && y <= m && !map[x][y] && !mark[x][y][dir] && jude2(x ,y);
    }






    int BFS()
    {
        queue<NODE>q;
        memset(mark ,0 ,sizeof(mark));
        xin.x = sx ,xin.y = sy ,xin.t = 0 ,xin.dir = sdir;
        mark[sx][sy][sdir] = 1;
        q.push(xin);
        while(!q.empty())
        {
            tou = q.front();
            q.pop();
            if(tou.x == ex && tou.y == ey) return tou.t;
            //lift
            xin = tou;
            xin.t ++ ,xin.dir ++;
            if(xin.dir == 5) xin.dir = 1;
            if(ok(xin.x ,xin.y ,xin.dir))
            {
                mark[xin.x][xin.y][xin.dir] = 1;
                q.push(xin);
            }


            //right
            xin = tou;
            xin.t ++ ,xin.dir --;
            if(xin.dir == 0) xin.dir = 4;
            if(ok(xin.x ,xin.y ,xin.dir))
            {
                mark[xin.x][xin.y][xin.dir] = 1;
                q.push(xin);
            }


            for(int i = 1 ;i <= 3 ;i ++)
            {
                xin = tou;
                xin.t ++;
                int mk = 0;
                if(tou.dir == 1)
                {
                    xin.x -= i;
                    for(int j = xin.x + 1;j < tou.x ;j ++)
                    if(map[j][xin.y] || map[j][xin.y+1])
                    mk = 1;
                }
                if(tou.dir == 3)
                {
                    xin.x += i;
                    for(int j = tou.x + 1;j < xin.x ;j ++)
                    if(map[j][xin.y] || map[j][xin.y+1])
                    mk = 1;
                }
                if(tou.dir == 2)
                {
                    xin.y += i;
                    for(int j = tou.y + 1 ;j < xin.y ;j ++)
                    if(map[xin.x][j] || map[xin.x+1][j]) mk = 1;
                }
                if(tou.dir == 4)
                {
                    xin.y -= i;
                    for(int j = xin.y + 1 ;j < tou.y ;j ++)
                    if(map[xin.x][j] || map[xin.x+1][j]) mk = 1;
                }


                if(!mk && ok(xin.x ,xin.y ,xin.dir))
                {
                    mark[xin.x][xin.y][xin.dir] = 1;
                    q.push(xin);
                }
            }
        }
        return -1;
    }


    int main ()
    {
        char str[10];
        while(~scanf("%d %d" ,&n ,&m) && n + m)
        {
            memset(map ,255 ,sizeof(map));
            for(int i = 1 ;i <= n ;i ++)
            for(int j = 1 ;j <= m ;j ++)
            scanf("%d" ,&map[i][j]);
            scanf("%d %d %d %d" ,&sx ,&sy ,&ex ,&ey);
            scanf("%s" ,str);
            if(str[0] == 'n') sdir = 1;
            else if(str[0] == 'e') sdir = 2;
            else if(str[0] == 's') sdir = 3;
            else sdir = 4;
            printf("%d " ,BFS());


        }
        return 0;
    }



  • 相关阅读:
    FZU 2150 Fire Game
    POJ 3414 Pots
    POJ 3087 Shuffle'm Up
    POJ 3126 Prime Path
    POJ 1426 Find The Multiple
    POJ 3278 Catch That Cow
    字符数组
    HDU 1238 Substing
    欧几里德和扩展欧几里德详解 以及例题CodeForces 7C
    Codeforces 591B Rebranding
  • 原文地址:https://www.cnblogs.com/csnd/p/12062521.html
Copyright © 2011-2022 走看看