# I - 驾驶卡丁车
思路:大模拟。一共有8各方向,每次只有是’L’或’R’的时候方向才会发送改变,且对于当前这一个格子来说,‘L’意味着向左偏转45,'R’意味着向右偏转45,所以对于任何一个格子来说,方向是确定的,可以通过加1、减1来确定改变之后的朝向。
#include<iostream>
#include<vector>
using namespace std;
const int N = 55;
int n,m,q;
int x,y;
char g[N][N];
int dx[] = {-1,-1,0,1,1,1,0,-1};
int dy[] = {0,-1,-1,-1,0,1,1,1};
bool check(int dir){
if(dir == 1 || dir == 3 || dir == 5 || dir == 7){
int x1 = x + dx[(dir + 7) % 8], y1 = y + dy[(dir + 7)%8];
int x2 = x + dx[(dir + 1) % 8], y2 = y + dy[(dir + 1)%8];
if(x1 > 0 && x1 <= n && y1 > 0 && y1 <= m && x2 > 0 && x2 <= n && y2 > 0 && y2 <= m && g[x1][y1] == '#' && g[x2][y2] == '#'){
return true;
}
}
return false;
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++){
cin>>g[i][j];
if(g[i][j] == '*'){
x = i;
y = j;
}
}
int q;
scanf("%d",&q);
char ch;
int v = 0;
int dir = 0;
while(q--){
cin>>ch;
if(ch == 'U'){
v++;
}
else if(ch == 'D'){
v = max(0,v-1);
}
else if(ch == 'L'){
dir = (dir + 1) % 8;
}
else{
dir = (dir + 7) % 8;
}
bool is_crash = true;
for(int i = 0; i < v; i++){
int xx = x + dx[dir];
int yy = y + dy[dir];
if(xx < 1 || xx > n || yy < 1 || yy > m || g[xx][yy] == '#' || check(dir)){
cout<<"Crash! "<<x<<" "<<y<<"\n";
is_crash = false;
v = 0;
break;
}
x = xx;
y = yy;
}
if(is_crash)
cout<<x<<" "<<y<<"\n";
}
return 0;
}