本文主要是介绍驾驶卡丁车,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
小Q正在设计一款2D卡丁车游戏,你的任务是帮助小Q实现其中的一部分功能。
在这款游戏中,游戏地图是一张 n 行 m 列的网格,从上到下依次编号为第 1 行到第 n 行,从左往右依次编号为第 1 列到第 m 列,其中第 i 行第 j 列的格子的坐标为 (i,j),每个格子要么是可以通行的平地,要么是不可通行的障碍。
在地图上的某个平地格子处有一辆由玩家操控的卡丁车。卡丁车的移动速率为 v,并且一共有8种可能的朝向,分别为:
- "上":前进一步时,将从 (x,y) 移动到 (x−1,y)。
- "下":前进一步时,将从 (x,y) 移动到 (x+1,y)。
- "左":前进一步时,将从 (x,y) 移动到 (x,y−1)。
- "右":前进一步时,将从 (x,y) 移动到 (x,y+1)。
- "左上":前进一步时,将从 (x,y) 移动到 (x−1,y−1)。
- "右上":前进一步时,将从 (x,y) 移动到 (x−1,y+1)。
- "左下":前进一步时,将从 (x,y) 移动到 (x+1,y−1)。
- "右下":前进一步时,将从 (x,y) 移动到 (x+1,y+1)。
一开始卡丁车朝上位于某个平地格子处,其初始移动速率为 v=0。接下来玩家将依次输入 q 条操作指令,每条操作指令是下列中的一种:
- "L":卡丁车朝向往左转 45 度。
- "R":卡丁车朝向往右转 45 度。
- "U":卡丁车的速率由 v 增大至 v+1。
- "D":卡丁车的速率由 vvv 减小至 max(v−1,0)。
在执行完每条操作指令后,卡丁车都会沿着其朝向前进 v 步,在移动结束后才会继续响应后续指令。在前进的过程中,如果某一步尝试驶入某个障碍格子或者尝试驶出地图,那么说明卡丁车发生了碰撞,它将就此结束移动,在保持朝向的同时速率 v 降低为 0。特别要注意的是,当朝向是斜45度时,为了防止"穿模"现象的发生,如果卡丁车两侧都是障碍,那么卡丁车同样将被认为发生了碰撞。例如卡丁车朝向右下,现在将从 (x,y) 移动到 (x+1,y+1),那么如果 (x+1,y) 和 (x,y+1) 都是障碍,则卡丁车发生了碰撞。
请写一个程序,在执行完每条操作指令后且卡丁车完成移动之后,汇报卡丁车的坐标以及这次移动过程中是否发生了碰撞。
Input
第一行包含两个正整数 n 和 m (1≤n,m≤50),表示地图的尺寸。
接下来 n 行,第 i 行包含一个长度为 m 的字符串,其中第 j 个字符描述格子 (i,j)。如果它是".",则说明 (i,j) 是平地;如果它是"#",则说明 (i,j) 是障碍;如果它是"*",则说明 (i,j) 是平地,且卡丁车位于此。输入数据保证存在恰好一个"*"。
接下来一行包含一个正整数 q (1≤q≤500),表示指令的数量。
接下来一行包含一个长度为 q 的字符串,每个字符是四种指令中的一种,依次描述每条指令。
Output
输出 q 行,第 i 行输出执行完第 i 条指令且卡丁车完成移动之后的相关信息。如果这一次卡丁车没有发生碰撞,那么输出"x y";如果这一次卡丁车发生了碰撞,那么输出"Crash! x y"。其中 x 和 y 表示卡丁车的坐标为 (x,y)。
Example
Input
5 4 .... ##.. ..#. .*.. .... 12 URULLULLLLUD
Output
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
10 10 ####....## ##.......# #....##... #...####.. #...####.. #...####.. #......... #...####.. ....####.. *...####.. 16 UURUURRULUULLUUD
Output
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
思路:
首先要记得找到卡丁车的位置之后要将其换成平地,以及横纵坐标每增加一个都要判断其有没有撞到,所以要一步一旬(函数move())。
方向可以取8的模来防止dir超出8。
#include<iostream>
using namespace std;
const int N=55,M=500;
int n,m,q;
char G[N][N],ins[M];
int sx,sy;
int v=0,dir=0;
char ch='#';
int d[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};//上 右上 右 右下 下 左下 左 左上
bool move();
int main()
{scanf("%d %d",&n,&m);getchar();//回车符for(int i=0;i<n;i++)scanf("%s",G[i]);for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(G[i][j]=='*'){sx=i;sy=j;G[i][j]=ch+11;}scanf("%d",&q);scanf("%s",ins);for(int i=0;i<q;i++){if(ins[i]=='U')v++;else if(ins[i]=='D'){v--;if(v<0)v=0;}else if(ins[i]=='R')dir=(dir+1)%8;else if(ins[i]=='L')dir=(dir+7)%8; if(move())printf("%d %d\n",sx+1,sy+1);else{printf("Crash! %d %d\n",sx+1,sy+1);v=0;}}return 0;
}
bool move()
{for(int j=1;j<=v;j++){int tx=sx+d[dir][0];int ty=sy+d[dir][1];if(tx<0||tx>=n||ty<0||ty>=m||G[tx][ty]=='#') return false;if((dir==1||dir==3||dir==5||dir==7)&&G[sx][ty]=='#'&&G[tx][sy]=='#') return false;sx=tx,sy=ty;}return true;
}
这篇关于驾驶卡丁车的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!