描述:
独轮车的轮子上有红、黄、蓝、白、绿(依顺时针序)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;
int sx, sy, sd, sc;
int fx, fy, fc;
char maze[21][21];
int visited[21][21][5][4];
int dir[4][2]= {{-1,0}, {0,1}, {1,0}, {0,-1}};
typedef struct Node
{int x;int y;int color;int direction;int time;Node(int x=0, int y=0, int color=0, int direction=0, int time=0):x(x), y(y), color(color), direction(direction), time(time){};
}status;int direct(char ch)
{switch(ch){case 'N':return 0;case 'E':return 1;case 'S':return 2;case 'W':return 3;}
}int color(char ch)
{switch(ch){case 'R':return 0;case 'Y':return 1;case 'B':return 2;case 'W':return 3;case 'G':return 4;}
}//直走
status toStraight(status u)
{status v = u;v.x = v.x+dir[u.direction][0];v.y = v.y+dir[u.direction][1];v.color = (v.color+1)%5;v.time ++;return v;
}//右转
status toRight(status u)
{status v = u;v.direction = (v.direction+1)%4;v.time ++;return v;
}//左转
status toLelf(status u)
{status v = u;v.direction = (v.direction+3)%4;v.time ++;return v;
}bool isAim(status u)
{if(u.x == fx && u.y == fy && u.color == fc)return true;elsereturn false;
}bool isLegal(status u)
{if(u.x > 0 && u.x < 21 && u.y > 0 && u.y < 21 && (!visited[u.x][u.y][u.color][u.direction]) && maze[u.x][u.y] == '.')return true;elsereturn false;
}
int bfs()
{queue<Node> q;status s = Node(sx, sy, sc, sd, 0);q.push(s);visited[sx][sy][sc][sd] = 1;while(!q.empty()){s = q.front();q.pop();status v = toStraight(s);if(isLegal(v)){if(isAim(v))return v.time;visited[v.x][v.y][v.color][v.direction] = 1;q.push(v);}v = toLelf(s);if(!visited[v.x][v.y][v.color][v.direction]){visited[v.x][v.y][v.color][v.direction] = 1;q.push(v);}v = toRight(s);if(!visited[v.x][v.y][v.color][v.direction]){visited[v.x][v.y][v.color][v.direction] = 1;q.push(v);}}return -1;
}
int main()
{char c, d;cin >> sx >> sy >> c >> d;sc = color(c), sd = direct(d);cin >> fx >> fy >> c;fc = color(c);for(int i = 1; i <= 20; i++){for(int j = 1; j <= 20; j++){cin >> maze[i][j];}}cout << bfs() << endl;return 0;
}