题目描述
年轻的拉尔夫开玩笑地从一个小镇上偷走一辆车,但他没想到的是那车属于警察局。并且车上装有用于发射车子移动路线的装置。那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息。
通过使用一张小镇的地图,帮助警察局找到那车。表示出该车最终所有可能的位置。
小镇的地图是矩形的,上面的符号用来标明那儿可以行车和那儿不行。“.” 表示小镇上那块地方是可以行车的,符号 “X” 表示此处不能行车。拉尔夫所开小车的初始位置,用字符的 “∗”,表示,且汽车能从初始位置通过。汽车能向四个方向移动:向北(上),南(下),西(左),东(右);拉尔夫所开小车的行动路线是通过一组给定的方向来描述的,在每个给定的方向,拉尔夫驾驶小车通过小镇上的一个或更多的可行车地点。
输入
第一行两个整数 n,m,表示小镇地图大小。(1≤n,m≤50)
接下来是一个 n∗m 的矩阵,由 .∗X 组成,表示小镇的地图。
再接下来一行一个整数 N(1≤N≤1000),表示接下来有 N 个方向。
接下来 N 行,每行一个方向单词,NORTH,SOUTH,WEST,EAST 分别表示上下左右,代表汽车的移动方向,任何两个连续的方向都不相同。
输出
输出小镇的地图,在地图上,汽车最终可能出现的点用 ∗ 来表示。
样例输入
4 5
.....
.X...
...*X
X.X..
3
NORTH
WEST
SOUTH
样例输出
.....
*X*..
*.*.X
X.X..
数据规模与约定
时间限制:1 s
内存限制:256 M
100% 的数据保证 1≤n,m≤50
#include <iostream>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
int n, m, check[55][55];
char map[55][55];
struct node {
int x, y;
};
queue<node> que;
int dir[4][2] = { -1,0,1,0,0,-1,0,1 };
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> map[i][j];
if (map[i][j] == '*') {
check[i][j] = 1;
map[i][j] = '.';
que.push({ i,j });
}
}
}
int N;
cin >> N;
while (N--) {
string s;
cin >> s;
int dir_num;
memset(check, 0, sizeof(check));
if (s == "NORTH") {
dir_num = 0;
}
else if (s == "SOUTH") {
dir_num = 1;
}
else if (s == "WEST") {
dir_num = 2;
}
else {
dir_num = 3;
}
int times = que.size();
for (int i = 0; i < times; i++) {
node temp = que.front();
que.pop();
for (int j = 1; 1; j++) {
int x = temp.x + j * dir[dir_num][0];
int y = temp.y + j * dir[dir_num][1];
if (map[x][y] != '.') break;
if (!check[x][y]) {
check[x][y] = 1;
que.push({ x,y });
}
}
}
}
while (!que.empty()) {
node temp = que.front();
que.pop();
map[temp.x][temp.y] = '*';
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cout << map[i][j];
}
cout << endl;
}
return 0;
}