警察找车.

题目描述
​ 年轻的拉尔夫开玩笑地从一个小镇上偷走一辆车,但他没想到的是那车属于警察局。并且车上装有用于发射车子移动路线的装置。那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息。

​ 通过使用一张小镇的地图,帮助警察局找到那车。表示出该车最终所有可能的位置。

​ 小镇的地图是矩形的,上面的符号用来标明那儿可以行车和那儿不行。“.” 表示小镇上那块地方是可以行车的,符号 “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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yitahutu79

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值