code vs 1026 逃跑的拉尔夫
1026 逃跑的拉爾夫
?
?時間限制: 1 s ?空間限制: 128000 KB ?題目等級 : 黃金 Gold 題解 題目描述?Description年輕的拉爾夫開玩笑地從一個小鎮(zhèn)上偷走了一輛車,但他沒想到的是那輛車屬于警察局,并且車上裝有用于發(fā)射車子移動路線的裝置。
那個裝置太舊了,以至于只能發(fā)射關(guān)于那輛車的移動路線的方向信息。
編寫程序,通過使用一張小鎮(zhèn)的地圖幫助警察局找到那輛車。程序必須能表示出該車最終所有可能的位置。
小鎮(zhèn)的地圖是矩形的,上面的符號用來標(biāo)明哪兒可以行車哪兒不行。“.”表示小鎮(zhèn)上那塊地方是可以行車的,而符號“X”表示此處不能行車。拉爾夫所開小車的初始位置用字符的“*”表示,且汽車能從初始位置通過。
汽車能向四個方向移動:向北(向上),向南(向下),向西(向左),向東(向右)。
拉爾夫所開小車的行動路線是通過一組給定的方向來描述的。在每個給定的方向,拉爾夫駕駛小車通過小鎮(zhèn)上一個或更多的可行車地點。
輸入描述?Input Description輸入文件的第一行包含兩個用空格隔開的自然數(shù)R和C,1≤R≤50,1≤C≤50,分別表示小鎮(zhèn)地圖中的行數(shù)和列數(shù)。
以下的R行中每行都包含一組C個符號(“.”或“X”或“*”)用來描述地圖上相應(yīng)的部位。
接下來的第R+2行包含一個自然數(shù)N,1≤N≤1000,表示一組方向的長度。
接下來的N行幅行包含下述單詞中的任一個:NORTH(北)、SOUTH(南)、WEST(西)和EAST(東),表示汽車移動的方向,任何兩個連續(xù)的方向都不相同。
輸出描述?Output Description輸出文件應(yīng)包含用R行表示的小鎮(zhèn)的地圖(象輸入文件中一樣),字符“*”應(yīng)該僅用來表示汽車最終可能出現(xiàn)的位置。
?
樣例輸入?Sample Input4 5
.....
.X...
...*X
X.X..
3
NORTH
WEST
SOUTH
?
樣例輸出?Sample Output.....
*X*..
*.*.X
X.X..
數(shù)據(jù)范圍及提示?Data Size & Hint分類標(biāo)簽?Tags?點此展開?
廣度優(yōu)先搜索?搜索 # include <stdio.h> # include <stdlib.h> # include <iostream> # include <string.h> # include <queue> # define cls(a) memset(a, 0, sizeof(a)) # define oo 2147483647 # define ll long long using namespace std;struct node {int x, y, d; } s; int n, m,tot; int map[51][51],boo[51][51][1001],step[1001]; int dx[5] = {0, -1, 1, 0, 0}; int dy[5] = {0, 0, 0, -1, 1}; queue <node> Q; inline void bfs() {boo[s.x][s.y][1] = 1;s.d = 1; //移動的方向 Q.push(s);//把s壓入隊列中 while(!Q.empty()){//如果隊列不為空 node v=Q.front(); //把v變成與node定義相同的結(jié)構(gòu)體,并使結(jié)構(gòu)體v中各元素的值與node中各元素的值相同; Q.pop();//彈出隊首元素 v.x+=dx[step[v.d]];//從開始點開始項規(guī)定方向移動(這是第v.d次的移動,v.d代表移動方向); v.y+=dy[step[v.d]];//同上; if(v.x>0&&v.x<=n&&v.y>0&&v.y<=m&&!boo[v.x][v.y][v.d]&&map[v.x][v.y]) {//移動不超范圍,并且在該方向下沒走到過,并且沒有圍墻 if(v.d == tot) map[v.x][v.y] = 2;//如果走完了,把該點記錄為能走到的最后一個點 boo[v.x][v.y][v.d] = 1;//否則標(biāo)記該點走過 Q.push(v);//把結(jié)構(gòu)體v壓入隊列; if(v.d + 1 <= tot)v.d++,Q.push(v);//如果沒走完走,繼續(xù)走 }} } int main() {scanf("%d%d", &n, &m);//讀入n,m; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++){char ch;scanf(" %c", &ch); //輸入字符 if(ch == '.') map[i][j] = 1;//用map數(shù)組將字符數(shù)組轉(zhuǎn)化為數(shù)字?jǐn)?shù)組; if(ch == '*') s.x = i, s.y = j, map[i][j] = 1;//s.x記錄下開始點的橫坐標(biāo),s.y記錄下開始點的縱坐標(biāo),開始點可走; }scanf("%d", &tot);//輸入所走方向數(shù); for(int i = 1; i <= tot; i++){char ch[10]; scanf(" %s", ch);//輸入方向if(ch[0] == 'N') step[i] = 1;if(ch[0] == 'S') step[i] = 2;if(ch[0] == 'W') step[i] = 3;if(ch[0] == 'E') step[i] = 4;//用1,2,3,4四個數(shù)代替北南西東,用step數(shù)組存方向 }bfs();//開始搜索 (重點) for(int i = 1; i <= n; i++, printf("\n"))for(int j = 1; j <= m; j++){char ch = 'X';if(map[i][j] == 2) ch = '*'; if(map[i][j] == 1) ch = '.';printf("%c", ch);//輸出結(jié)束后的狀態(tài)圖; }return 0; }?
廣度優(yōu)先搜索,搜每種情況下能到達(dá)的所有情況,然后對每種情況繼續(xù)搜索,直至搜索完畢后輸出;轉(zhuǎn)載于:https://www.cnblogs.com/cangT-Tlan/p/6050823.html
總結(jié)
以上是生活随笔為你收集整理的code vs 1026 逃跑的拉尔夫的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 2-2:C++快速入门之输入和输出
- 下一篇: Zookeeper C 回调函数
