NOJ-1044.独轮车

1044.独轮车

时限:1000ms 内存限制:10000K 总时限:3000ms

  • 描述
    独轮车的轮子上有红、黄、蓝、白、绿(依顺时针序)5种颜色,在一个如下图所示的20*20的迷宫内每走一个格子,轮子上的颜色变化一次。独轮车只能向前推或在原地转向。每走一格或原地转向90度均消耗一个单位时间。现给定一个起点(S)和一个终点(T),求独轮车以轮子上的指定颜色到达终点所需的最短时间。

  • 输入
    本题包含一个测例。测例中分别用一个大写字母表示方向和轮子的颜色,其对应关系为:E-东、S-南、W-西、N-北;R-红、Y-黄、B-蓝、W-白、G-绿。在测试数据的第一行有以空格分隔的两个整数和两个大写字母,分别表示起点的坐标S(x,y)、轮子的颜色和开始的方向,第二行有以空格分隔的两个整数和一个大写字母,表示终点的坐标T(x,y)和到达终点时轮子的颜色,从第三行开始的20行每行内包含20个字符,表示迷宫的状态。其中’X’表示建筑物,’.'表示路.

  • 输出
    在单独的一行内输出一个整数,即满足题目要求的最短时间。

  • 输入样例
    3 4 R N
    15 17 Y
    XXXXXXXXXXXXXXXXXXXX
    X.X…XXXXXX…XX
    X.X.X…X…XXXX…X
    X.XXXXXXX.XXXXXXXX.X
    X.X.XX…X…X
    X…XXXXX.X.XX.X.XXX
    X.X.XX…X.X…X.X.X
    X.X.X…XX…XXXX.XXX
    X.X.XX.XX.X…X.X.X
    X.X…XX.X.XX.X.X.X
    X.X.X.XXXXX.XX.X.XXX
    X.X.X.XXXXX…X…X
    X.X…X.XX…X.X
    X.XXX.XXX.X.XXXXXXXX
    X…XX…X…X
    XXXXX…X.XXXXXXX.X
    X…XXXXXXX.XXX.XXX.X
    X.XX…X…X
    X…X.XXXX.XXXX…XXX
    XXXXXXXXXXXXXXXXXXXX

  • 输出样例
    56

  • 附上代码

#include <iostream>
#include <queue>
using namespace std;

struct node
{
    int x, y, dir, color, te;
    node(int _x, int _y, int _dir, int _color,int _te)
    {
        x = _x, y = _y, dir=_dir, color=_color ,te = _te;
    }
};
bool maze[21][21];
bool fg[21][21][4][5];
int dirx[4]={0,1,0,-1};
int diry[4]={1,0,-1,0};
queue<node> q;
int bfs(int tx,int ty,int color)
{
    while(!q.empty())
    {
        node nd=q.front();
        q.pop();
        int x=nd.x,y=nd.y,dir=nd.dir,col=nd.color,te=nd.te;
        //cout<<x<<' '<<y<<' '<<dir<<' '<<te<<endl;
        if(x==tx&&y==ty&&col==color)return te;
        if(fg[x][y][dir][col])continue;
        fg[x][y][dir][col]=1;
        te++;
        int xx=x+dirx[dir],yy=y+diry[dir];
        if(xx>0&&xx<21&&yy>0&&yy<21&&maze[xx][yy])
        {
            q.push(node(xx, yy, dir, (col + 1) % 5, te));
        }
        q.push(node(x,y,(dir+1)%4,col,te));
        q.push(node(x,y,(dir+3)%4,col,te));
    }
    return -1;
}
inline int judgecolor(char c)
{
    switch(c)
    {
        case 'R':return 0;
        case 'Y':return 1;
        case 'B':return 2;
        case 'W':return 3;
        default :return 4;
    }
}
inline int judgedir(char c)
{
    switch(c){
        case 'E':return 0;
        case 'S':return 1;
        case 'W':return 2;
        default :return 3;
    }
}
int main()
{
    int sx,sy,tx,ty;
    char c;
    cin>>sx>>sy>>c;
    int color=judgecolor(c);
    cin>>c>>tx>>ty;
    int dir=judgedir(c);
    q.push(node(sx,sy,dir,color,0));
    //cout<<dir<<' '<<color<<endl;
    cin>>c;
    color=judgecolor(c);
    //cout<<color<<endl;
    for(int i=1;i<=20;++i)
    {
        for(int j=1;j<=20;++j)
        {
            cin>>c;
            if(c=='.')maze[i][j]=1;
        }
    }
    cout<<bfs(tx,ty,color)<<endl;
    return 0;
}

/*
2 2 W E
19 17 W
XXXXXXXXXXXXXXXXXXXX
X.X..X..X..X..X..X.X
X........X...X.....X
XX.XX..X..X.XX..X..X
X.X....X........X..X
X.X..X..X..X..X..X.X
X......X..X........X
XX..X..X..X.XX..X.XX
X.X...........X....X
X.X.XX..X..X..X..X.X
X..........X....X..X
XXX.X..X.XX..X..X..X
X.....X.......X....X
X.X..X..X..X..X..X.X
X.X..........X.....X
XX..X..XXXX..X..X..X
X..................X
X.X..X..X..X..X..X.X
X.......X..........X
XXXXXXXXXXXXXXXXXXXX
*/
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值