1. 程式人生 > >codevs 1026 逃跑的拉爾夫

codevs 1026 逃跑的拉爾夫

空格 r+ small iostream data- 起點 數據 return 題目

題目描述 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..

數據範圍及提示 Data Size & Hint

分類標簽 Tags 點此展開

廣度優先搜索 搜索
#include<queue>
#include
<cstdio> #include<cstring> #include<iostream> using namespace std; bool map[100][100],pd[51][51][1001]; //pd[i][j][k]表示有沒有用k步走到過點(i,j),用來去重 int d[1010]; int w=1,t=0; int r,c,n,sx,sy; struct point { int x,y,step; }poi[1000000];//記錄點的坐標和步數 void init(int x,int y,int k) { if(map[x][y]&&!pd[x][y][k]) { w++; poi[w].x=x; poi[w].y=y; poi[w].step=k; pd[x][y][k]=1; }//如果能用k步走到(x,y)就加入隊列,標記一下 } void bfs() { poi[1].x=sx; poi[1].y=sy; poi[1].step=0; //將起點加入隊列 while(t<w) { t++; int k=poi[t].step+1; int now=d[k]; int i=poi[t].x,j=poi[t].y; while(k<=n)//一個方向能走到的點全部加入隊列,然後換下個方向 { if(now==1) i--; if(now==2) j++; if(now==3) i++; if(now==4) j--; if(i>=1&&i<=r&&j>=1&&j<=c&&map[i][j]) init(i,j,k); else break; } } } int main() { scanf("%d%d",&r,&c); for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) { char ch; cin>>ch; if(ch==.) map[i][j]=1; else if(ch==X) map[i][j]==0; else if(ch==*) { sx=i; sy=j; map[i][j]=1; } } scanf("%d",&n); for(int i=1;i<=n;i++) { string s; cin>>s; if(s=="NORTH") d[i]=1; else if(s=="EAST") d[i]=2; else if(s=="SOUTH") d[i]=3; else d[i]=4; } bfs(); for(int i=1;i<=r;i++) { for(int j=1;j<=c;j++) { if(map[i][j]==0) printf("X"); else if(pd[i][j][n]) printf("*"); else printf("."); } printf("\n"); } return 0; }

codevs 1026 逃跑的拉爾夫