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
*/