「CODEVS1026」逃跑的拉尔夫
题目描述 Description
年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置。
那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息。
编写程序,通过使用一张小镇的地图帮助警察局找到那辆车。程序必须能表示出该车最终所有可能的位置。
小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行。“.”表示小镇上那块地方是可以行车的,而符号“X”表示此处不能行车。拉尔夫所开小车的初始位置用字符的“*”表示,且汽车能从初始位置通过。
汽车能向四个方向移动:向北(向上),向南(向下),向西(向左),向东(向右)。
拉尔夫所开小车的行动路线是通过一组给定的方向来描述的。在每个给定的方向,拉尔夫驾驶小车通过小镇上一个或更多的可行车地点。
输入描述 Input Description
输入文件的第一行包含两个用空格隔开的自然数R和C,1≤R≤50,1≤C≤50,分别表示小镇地图中的行数和列数。
以下的R行中每行都包含一组C个符号(“.”或“X”或“*”)用来描述地图上相应的部位。
接下来的第R+2行包含一个自然数N,1≤N≤1000,表示一组方向的长度。
接下来的N行幅行包含下述单词中的任一个:NORTH(北)、SOUTH(南)、WEST(西)和EAST(东),表示汽车移动的方向,任何两个连续的方向都不相同。
输出描述 Output Description
输出文件应包含用R行表示的小镇的地图(象输入文件中一样),字符“*”应该仅用来表示汽车最终可能出现的位置。
样例输入 Sample Input
4 5
…..
.X…
…*X
X.X..
3
NORTH
WEST
SOUTH
样例输出 Sample Output
…..
*X*..
*.*.X
X.X..
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
#include<cstdio> #include<string> #include<iostream> using namespace std; int n,m,p; int bx,by; bool mp[51][51],pd[51][51][1001]; int order[1001]; struct data{ int x,y,step; }d[1000000]; int t=0,w=1; void init(int x,int y,int k) { if(mp[x][y]&&!pd[x][y][k]) { d[w].x=x;d[w].y=y;d[w].step=k; pd[x][y][k]=1; w++; } } void move()//1,2,3,4 w,s,a,d { int k=d[t].step+1; int dir=order[k]; int i=d[t].x,j=d[t].y; while(k<=p) { if(dir==1)i--; if(dir==2)i++; if(dir==3)j--; if(dir==4)j++; if(i<=n&&j<=m&&mp[i][j])init(i,j,k); else break; } } void bfs() { d[0].x=bx;d[0].y=by;d[0].step=0; while(t<w) { move(); t++; } } int main() { string str; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) { cin>>str; for(int j=0;j<m;j++) { if(str[j]=='.')mp[i][j+1]=1; else if(str[j]=='*'){bx=i;by=j+1;mp[i][j+1]=1;} } } scanf("%d",&p); for(int i=1;i<=p;i++) { string dir; cin>>dir; if(dir=="NORTH")order[i]=1; else if(dir=="SOUTH")order[i]=2; else if(dir=="WEST")order[i]=3; else order[i]=4; } bfs(); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(mp[i][j]==0)printf("X"); else if(pd[i][j][p])printf("*"); else printf("."); } printf("\n"); } return 0; } |