题目链接:Problem - I - Codeforces
小Q正在设计一款2D卡丁车游戏,你的任务是帮助小Q实现其中的一部分功能。
在这款游戏中,游戏地图是一张 nn 行 mm 列的网格,从上到下依次编号为第 11 行到第 nn 行,从左往右依次编号为第 11 列到第 mm 列,其中第 ii 行第 jj 列的格子的坐标为 (i,j)(i,j),每个格子要么是可以通行的平地,要么是不可通行的障碍。
在地图上的某个平地格子处有一辆由玩家操控的卡丁车。卡丁车的移动速率为 vv,并且一共有8种可能的朝向,分别为:
- "上":前进一步时,将从 (x,y)(x,y) 移动到 (x−1,y)(x−1,y)。
- "下":前进一步时,将从 (x,y)(x,y) 移动到 (x+1,y)(x+1,y)。
- "左":前进一步时,将从 (x,y)(x,y) 移动到 (x,y−1)(x,y−1)。
- "右":前进一步时,将从 (x,y)(x,y) 移动到 (x,y+1)(x,y+1)。
- "左上":前进一步时,将从 (x,y)(x,y) 移动到 (x−1,y−1)(x−1,y−1)。
- "右上":前进一步时,将从 (x,y)(x,y) 移动到 (x−1,y+1)(x−1,y+1)。
- "左下":前进一步时,将从 (x,y)(x,y) 移动到 (x+1,y−1)(x+1,y−1)。
- "右下":前进一步时,将从 (x,y)(x,y) 移动到 (x+1,y+1)(x+1,y+1)。
一开始卡丁车朝上位于某个平地格子处,其初始移动速率为 v=0v=0。接下来玩家将依次输入 qq 条操作指令,每条操作指令是下列中的一种:
- "L":卡丁车朝向往左转 4545 度。
- "R":卡丁车朝向往右转 4545 度。
- "U":卡丁车的速率由 vv 增大至 v+1v+1。
- "D":卡丁车的速率由 vv 减小至 max(v−1,0)max(v−1,0)。
在执行完每条操作指令后,卡丁车都会沿着其朝向前进 vv 步,在移动结束后才会继续响应后续指令。在前进的过程中,如果某一步尝试驶入某个障碍格子或者尝试驶出地图,那么说明卡丁车发生了碰撞,它将就此结束移动,在保持朝向的同时速率 vv 降低为 00。特别要注意的是,当朝向是斜4545度时,为了防止"穿模"现象的发生,如果卡丁车两侧都是障碍,那么卡丁车同样将被认为发生了碰撞。例如卡丁车朝向右下,现在将从 (x,y)(x,y) 移动到 (x+1,y+1)(x+1,y+1),那么如果 (x+1,y)(x+1,y) 和 (x,y+1)(x,y+1) 都是障碍,则卡丁车发生了碰撞。
请写一个程序,在执行完每条操作指令后且卡丁车完成移动之后,汇报卡丁车的坐标以及这次移动过程中是否发生了碰撞。
Input
第一行包含两个正整数 nn 和 mm (1≤n,m≤501≤n,m≤50),表示地图的尺寸。
接下来 nn 行,第 ii 行包含一个长度为 mm 的字符串,其中第 jj 个字符描述格子 (i,j)(i,j)。如果它是".",则说明 (i,j)(i,j) 是平地;如果它是"#",则说明 (i,j)(i,j) 是障碍;如果它是"*",则说明 (i,j)(i,j) 是平地,且卡丁车位于此。输入数据保证存在恰好一个"*"。
接下来一行包含一个正整数 qq (1≤q≤5001≤q≤500),表示指令的数量。
接下来一行包含一个长度为 qq 的字符串,每个字符是四种指令中的一种,依次描述每条指令。
Output
输出 qq 行,第 ii 行输出执行完第 ii 条指令且卡丁车完成移动之后的相关信息。如果这一次卡丁车没有发生碰撞,那么输出"x y";如果这一次卡丁车发生了碰撞,那么输出"Crash! x y"。其中 xx 和 yy 表示卡丁车的坐标为 (x,y)(x,y)。
Examples
input
Copy
5 4 .... ##.. ..#. .*.. .... 12 URULLULLLLUD
output
Copy
3 2 Crash! 3 2 Crash! 3 2 3 2 3 2 Crash! 3 2 3 2 3 2 3 2 3 2 4 3 4 3
input
Copy
10 10 ####....## ##.......# #....##... #...####.. #...####.. #...####.. #......... #...####.. ....####.. *...####.. 16 UURUURRULUULLUUD
output
Copy
9 1 Crash! 9 1 9 1 8 2 6 4 Crash! 6 4 6 4 7 5 7 6 7 8 Crash! 7 10 7 10 7 10 6 10 4 10 3 10
思路:这个是一道模拟题,但是不难,按照题目意思写下来就好了
#include<bits/stdc++.h>
using namespace std;
int dir[8][2] = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}};
char ch[55][55];
string s;
int main(){
int n, m;
int q;
cin >> n >> m;
int x, y;
for(int i = 1; i <= n; i++){
for(int l = 1; l <= m; l++){
cin >> ch[i][l];
if(ch[i][l] == '*'){
x = i;
y = l;
}
}
}
cin >> q;
cin >> s;
int ans = 0;
int v = 0;
for(int i = 0; i < q; i++){
if(s[i] == 'R'){
ans++;
if(ans >= 8){
ans %= 8;
}
}else if(s[i] == 'L'){
ans--;
if(ans < 0){
ans += 8;
}
}else if(s[i] == 'U'){
v++;
}else {
v = max(v - 1, 0);
}
bool flag = 0;
for(int l = 0; l < v; l++){
if(ans == 0 || ans == 2 || ans == 4 || ans == 6){
x = x + dir[ans][0];
y = y + dir[ans][1];
if((x < 1 || y < 1 || x > n || y > m) || ch[x][y] == '#'){
flag = 1;
x = x - dir[ans][0];
y = y - dir[ans][1];
v = 0;
break;
}
}else{
x = x + dir[ans][0];
y = y + dir[ans][1];
if((x < 1 || y < 1 || x > n || y > m) || ch[x][y] == '#'){
flag = 1;
x = x - dir[ans][0];
y = y - dir[ans][1];
v = 0;
break;
}
if(ch[x - dir[ans][0]][y] == '#' && ch[x][y - dir[ans][1]] == '#'){
flag = 1;
x = x - dir[ans][0];
y = y - dir[ans][1];
v = 0;
break;
}
}
}
if(flag){
cout << "Crash! ";
}
cout << x << " " << y << endl;
}
return 0;
}