2021年中国大学生程序设计竞赛女生专场 I. 驾驶卡丁车

题目链接:​​​​​​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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值