有一个智能机器人,我们可以通过给它发送移动指令来控制它在一个方格矩阵地图中进行移动。
移动指令共有以下四种:
U
,向上移动一格距离。D
,向下移动一格距离。L
,向左移动一格距离。R
,向右移动一格距离。
矩阵地图可以无限大,矩阵地图中的方格可以是空格也可以是陷阱。
机器人移动至空格则安然无恙,移动至陷阱则被摧毁。
现在,机器人的移动指令已经全部设定完毕。
请问,是否可以构造一个合适的矩阵地图,并选择地图中的两个不同空格位置作为起点和终点,使得:
- 机器人能够从起点开始,按照设定好的一系列移动指令进行移动,最终安全抵达终点。
- 机器人的实际移动路径是起点到终点的最短(安全)路径(之一)。
输入格式
一行,一个由大写字母 U
、D
、L
、R
构成的字符串,表示设定完毕的机器人的移动指令。
输出格式
一行,如果可以构造出合适的地图,则输出 YES
,否则输出 NO
。
数据范围
前三个测试点满足,1≤输入字符串长度 ≤10≤10。
所有测试点满足,1≤ 输入字符串长度 ≤100。
输入样例1:
LLUUUR
输出样例1:
YES
输入样例2:
RRUULLDD
输出样例2:
NO
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 210;
int num[N][N];
int dx[4] = {-1 , 0 , 1 , 0};
int dy[4] = {0 , 1 , 0 , -1};
bool pd(int x0 , int y0 ,int x , int y){
int temp = x - x0;
int temp1 = y - y0;
int j;
for (j = 0; j < 4; j ++ ){
if(dx[j] == temp && dy[j] == temp1) continue;
if(num[x0 + dx[j]][y0 + dy[j]] == 1){
return true;
break;
}
}
if(j == 4) return false;
}
int main()
{
int i;
string s;
cin >> s;
int x0 = 105;
int y0 = 105;
num[x0][y0] = 1;
bool flag = true;
for (i = 0; i < s.size(); i ++ ){
int x = x0 , y = y0;
if(s[i] == 'U') x0 += dx[0],y0 +=dy[0];
if(s[i] == 'R') x0 += dx[1],y0 +=dy[1];
if(s[i] == 'D') x0 += dx[2],y0 +=dy[2];
if(s[i] == 'L') x0 += dx[3],y0 +=dy[3];
if(num[x0][y0] == 1){
//cout << "NO" << endl;
flag = false;
//break;
}
else num[x0][y0] = 1;
//cout << x0<<" "<<y0<<" "<<x<<" "<<y<<" "<<endl;
if(pd(x0 , y0 , x , y)){
//cout << "NO" << endl;
flag = false;
//break;
}
}
if(flag == true) cout << "YES" <<endl;
else cout << "NO" << endl;
/*for (int i = 90; i < 130; i ++ ){
for (int j = 90; j < 130; j ++ ){
cout << num[i][j] << " ";
}
cout << endl;
}*/
return 0;
}