Codevs 1026 逃跑的拉尔夫
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold
题目描述 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..
STL模拟:(MLE~~55555555555555...)
1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 #include<queue>
5 using namespace std;
6 int n,m,nn;
7 queue<int> q,p;// q横坐标 p从坐标
8 int map[51][51],sx,sy,f[51][51];
9 void north()
10 {
11 int kk=q.size();
12 for(int i=1;i<=kk;i++)
13 {
14 int u=q.front(),v=p.front();
15 q.pop();p.pop();
16 while(map[u-1][v]!=0&&u-1>=0)
17 {
18 u--;
19 q.push(u);
20 p.push(v);
21 }
22 }
23 }
24 void south()
25 {
26 int kk=q.size();
27 for(int i=1;i<=kk;i++)
28 {
29
30 int u=q.front(),v=p.front();
31 q.pop();p.pop();
32 while(map[u+1][v]!=0&&u+1<=n)
33 {
34 u++;
35 q.push(u);
36 p.push(v);
37 }
38 }
39 }
40 void west()
41 {
42 int kk=q.size();
43 for(int i=1;i<=kk;i++)
44 {
45
46 int u=q.front(),v=p.front();
47 q.pop();p.pop();
48 while(map[u][v-1]!=0&&v-1>=0)
49 {
50 v--;
51 q.push(u);
52 p.push(v);
53 }
54 }
55 }
56 void east()
57 {
58 int kk=q.size();
59 for(int i=1;i<=kk;i++)
60 {
61
62 int u=q.front(),v=p.front();
63 q.pop();p.pop();
64 while(map[u][v+1]!=0&&v+1<=m)
65 {
66 v++;
67 q.push(u);
68 p.push(v);
69 }
70 }
71 }
72 int main()
73 {
74 cin>>n>>m;
75 char c; string s;
76 for(int i=1;i<=n;i++)
77 for(int j=1;j<=m;j++)
78 {
79 cin>>c;
80 if(c=='*') {map[i][j]=1;sx=i;sy=j;}
81 if(c=='.') map[i][j]=1;
82 if(c=='X') map[i][j]=0;
83 }
84 cin>>nn;
85 q.push(sx);
86 p.push(sy);
87 for(int i=1;i<=nn;i++)
88 {
89 cin>>s;
90 if(s=="NORTH") north();
91 if(s=="SOUTH") south();
92 if(s=="WEST") west();
93 if(s=="EAST") east();
94 }
95 memset(f,0,sizeof f );
96 while(!q.empty()&&!p.empty())
97 {
98 int u=q.front();int v=p.front();
99 q.pop();p.pop();
100 f[u][v]=1;
101 }
102 for(int i=1;i<=n;i++)
103 {
104 for(int j=1;j<=m;j++)
105 {
106 if(!f[i][j])
107 {
108 if(map[i][j]==1)
109 cout<<'.';
110 if(map[i][j]==0)
111 cout<<'X';
112 }
113 if(f[i][j])
114 cout<<'*';
115 }
116 cout<<endl;
117 }
118
119 return 0;
120 }
AC代码:
1 #include<cstdio>
2 #include<cstring>
3 #include<string>
4 #include<iostream>
5 using namespace std;
6 #define N 55
7 char g[N][N];
8 int r,c,n,x,y,ans[N][N];
9 string ch;
10 void deal(int t){
11 int nx,ny;
12 if(ch=="NORTH"){
13 nx=x-1;
14 while(nx>0&&g[nx][y]!='X'&&ans[nx][y]<t){
15 ans[nx][y]=t;nx--;
16 }
17 }
18 else if(ch=="SOUTH"){
19 nx=x+1;
20 while(nx<=r&&g[nx][y]!='X'&&ans[nx][y]<t){
21 ans[nx][y]=t;nx++;
22 }
23 }
24 else if(ch=="WEST"){
25 ny=y-1;
26 while(ny>0&&g[x][ny]!='X'&&ans[x][ny]<t){
27 ans[x][ny]=t;ny--;
28 }
29 }
30 else if(ch=="EAST"){
31 ny=y+1;
32 while(ny<=c&&g[x][ny]!='X'&&ans[x][ny]<t){
33 ans[x][ny]=t;ny++;
34 }
35 }
36 }
37 int main(){
38 cin>>r>>c;
39 for(int i=1;i<=r;i++)
40 for(int j=1;j<=c;j++){
41 cin>>g[i][j];
42 if(g[i][j]=='*') x=i,y=j;
43 }
44 memset(ans,-1,sizeof ans);
45 ans[x][y]=0;
46 cin>>n;
47 for(int k=1;k<=n;k++){
48 cin>>ch;
49 for(int i=1;i<=r;i++)
50 for(int j=1;j<=c;j++)
51 if(ans[i][j]==k-1) x=i,y=j,deal(k);
52 }
53 for(int i=1;i<=r;i++){
54 for(int j=1;j<=c;j++)
55 if(ans[i][j]==n) cout<<'*';
56 else if(g[i][j]=='X') cout<<'X';
57 else cout<<'.';
58 cout<<endl;
59 }
60 return 0;
61 }
思路:心累,不解释~