Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
有一个智能机器人,我们可以通过给它发送移动指令来控制它在一个方格矩阵地图中进行移动。
移动指令共有以下四种:
U,向上移动一格距离。D,向下移动一格距离。L,向左移动一格距离。R,向右移动一格距离。
矩阵地图可以无限大,矩阵地图中的方格可以是空格也可以是陷阱。
机器人移动至空格则安然无恙,移动至陷阱则被摧毁。
现在,机器人的移动指令已经全部设定完毕。
请问,是否可以构造一个合适的矩阵地图,并选择地图中的两个不同空格位置作为起点和终点,使得:
- 机器人能够从起点开始,按照设定好的一系列移动指令进行移动,最终安全抵达终点。
- 机器人的实际移动路径是起点到终点的最短(安全)路径(之一)。
输入格式
一行,一个由大写字母 U、D、L、R 构成的字符串,表示设定完毕的机器人的移动指令。
输出格式
一行,如果可以构造出合适的地图,则输出 YES,否则输出 NO。
数据范围
前三个测试点满足,1≤ 输入字符串长度 ≤10。 所有测试点满足,1≤输入字符串长度 ≤100。
输入样例1:
LLUUUR
输出样例1:
YES
输入样例2:
RRUULLDD
输出样例2:
NO
思路
使用基本的BFS模板求解。这道题目的意思是从起点走到终点,按指令的路径走是否为最短(指令之外的空格都不能走)。很显然这是一道求最短路问题,那我们可以使用bfs深度优先遍历进行求解。遍历所有的指令,把每一个机器人走的格子标记为1,那么不能走的格子就为0了,遍历完字符串后,发现一张迷宫已经构造完成,这时就可以使用模板进行搜索,判断最后的路径是否等于指令的长度,如果等于那么返回YES,否则返回FALSE。
代码
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
const int N =210, B = N /2;
typedef pair<int, int> PII;
PII p[N * N];
int dist[N][N], aa[N][N];
string h;
int a = B, b = B;
void bfs()
{
int hh = 0, tt = 0;
memset(dist,-1,sizeof dist);
dist[B][B] = 0;
p[0] = {B,B};
int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0 , -1, 1};
while(hh <= tt)
{
auto t = p[hh ++];
for(int i = 0;i < 4;i ++)
{
int x = dx[i] + t.first, y = dy[i] + t.second;
//cout << x << ' ' << y << endl;
if(x >= 0 && x < N && y >= 0 && y < N && aa[x][y] == 1 && dist[x][y] == -1)
{
dist[x][y] = dist[t.first][t.second] + 1;
p[++ tt] = {x, y};
}
}
}
//cout << dist[a][b] << endl;
int res = dist[a][b];
if(res == h.size()) cout << "YES" << endl;
else cout << "NO" << endl;
}
int main()
{
cin >> h;
for(int i = 0;i < h.size(); i++)
{
if(h[i] == 'U') a -= 1;
else if(h[i] == 'D') a += 1;
else if(h[i] == 'L') b -= 1;
else if(h[i] == 'R') b += 1;
// 把其他格子放置炸弹
//cout << a << ' ' << b << endl;
aa[a][b] = 1;
}
bfs();
return 0;
}