poj1376 robot bfs

需要注意一下几点:

1.每次只能转九十度

2. 不能走边界

3.边界需要特判

4.终点可能不能到达

代码如下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <queue>

using namespace std;
int dir[4][2]= {0 , 1 ,1 , 0 , 0 , -1 ,  -1 , 0};
char direct[4][10]= {"east" , "south", "west"  , "north"};
int Map[55][55];
int visit[55][55][4];
int m,n;
int sx,sy,ex,ey;
int sum;
struct node
{
    int x;
    int y;
    int dir;
    int step;
};

int Find(char *a)
{
    for(int i = 0 ; i < 4 ; i ++ )
    {
        if(strcmp(a , direct[i]) == 0)
        {
            return i;
        }
    }

    return -1;
}

void BFS(char *a)
{
    node temp;
    temp.dir = Find(a);
    temp.x = sx;
    temp.y = sy;
    temp.step = 0;
    visit[sx][sy][temp.dir] = 1;
    queue <node>Q;
    Q.push(temp);
    while(!Q.empty())
    {
        temp = Q.front();
        Q.pop();
        if(temp.x == ex && temp.y == ey)
        {
            sum = temp.step;
            while(!Q.empty()) Q.pop();
            break;
        }
        for(int i = 1 ; i <= 3 ; i ++ )
        {
            node cur;
            cur.x = temp.x + i * dir[temp.dir][0];
            cur.y = temp.y + i * dir[temp.dir][1];
            cur.dir = temp.dir;
            cur.step = temp.step + 1;
            if(cur.x < m  && cur.x > 0 && cur.y < n  && cur.y > 0 && !visit[cur.x][cur.y][cur.dir])
            {

                if(cur.dir == 0)
                {
                    if(Map[cur.x][cur.y] == 1 || Map[cur.x - 1][cur.y] == 1) break;
                }
                else if(cur.dir == 1)
                {
                    if(Map[cur.x][cur.y] == 1 || Map[cur.x][cur.y - 1] == 1) break;
                }
                else if(cur.dir == 2)
                {
                    if(Map[cur.x][cur.y - 1] == 1 || Map[cur.x - 1][cur.y - 1] == 1) break;
                }
                else
                {
                    if(Map[cur.x - 1][cur.y] == 1 || Map[cur.x - 1][cur.y - 1] == 1) break;
                }
                visit[cur.x][cur.y][cur.dir] = 1;
                Q.push(cur);
            }
        }
        node cur;
        cur.x = temp.x;
        cur.y = temp.y;
        cur.dir = (temp.dir + 1 ) % 4;
        cur.step = temp.step + 1;
        if(!visit[cur.x][cur.y][cur.dir])
        {
            Q.push(cur);
            visit[cur.x][cur.y][cur.dir] = 1;
        }
        cur.dir = ( (temp.dir - 1) % 4 + 4) % 4;
        if(!visit[cur.x][cur.y][cur.dir])
        {
            Q.push(cur);
            visit[cur.x][cur.y][cur.dir] = 1;
        }
    }
    return ;
}

int main()
{
    while(scanf("%d%d", &m ,&n) != EOF && (m || n))
    {
        for(int i = 0 ; i < m ; i ++ )
        {
            for(int j = 0 ; j < n ; j ++ )
            {
                scanf("%d", &Map[i][j]);
            }
        }
        scanf("%d%d", &sx ,&sy);
        scanf("%d%d", &ex ,&ey);
        char a[10];
        cin >> a ;
        if(sx < 1 || sx > m - 1 || ex < 1 || ex > m - 1 || sy < 1 || sy > n - 1 || ey < 1 || ey > n - 1)
        {
            printf("-1\n");
            continue;
        }
        if(Map[ex][ey] == 1 || Map[ex - 1][ey] == 1 || Map[ex - 1][ey - 1] == 1 || Map[ex][ey - 1] == 1)
        {
            printf("-1\n");
            continue;
        }
        if(Map[sx][sy] == 1 || Map[sx - 1][sy] == 1 || Map[sx - 1][sy - 1] == 1 || Map[sx][sy - 1] == 1)
        {
            printf("-1\n");
            continue;
        }
        sum = -1;
        memset(visit , 0 , sizeof(visit));
        BFS(a);
        printf("%d\n" , sum);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值