生活随笔
收集整理的這篇文章主要介紹了
uestc oj 1002 解救小Q
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
解救小Q
Description
小Q被邪惡的大魔王困在了迷宮里,love8909決定去解救她。
迷宮里面有一些陷阱,一旦走到陷阱里,就會被困身亡:(,迷宮
里還有一些古老的傳送陣,一旦走到傳送陣上,會強制被傳送到
傳送陣的另一頭。
現在請你幫助love8909算一算,他至少需要走多少步才能解
救到小Q?
Input
第一行為一個整數T,表示測試數據組數。
每組測試數據第一行為兩個整數N,M,(N, M)表示
迷宮的長和寬。
接下來有N行,每行M個字符,是迷宮的具體描述。
.表示安全的位置
#表示陷阱,
Q表示小Q的位置
L表示love8909所在位置,
數據保證love8909只有一個,數據也保證小Q只有一個。
小寫字母a-z表示分別表示不同的傳送陣,數據保證傳送陣
兩兩配對。
Output
每組數據輸出一行,解救小Q所需的最少步數,如果無論如何都
無法救小Q,輸出-1。
Sample Input
2
5 5
....L
.###.
b#b#a
##.##
...Qa
5 5
....L
.###.
.#.#.
##.##
...Q.
Sample Output
3
-1
?
? 這一題就是普通的廣度優先搜索求取最短路的題目。
? 不過這個題目添加了傳動帶和陷阱的這兩個障礙。
? 這一題也是有讀入回車的getchar處理因為讀入的都是字符的。
? 單獨開一個數組【26】【2】的存放傳送帶 用結構體來表示 有表示是第一個節點還是第二個節點的
?flag 還有坐標row col還有 值s
? 在廣搜的時候遇到傳送帶就傳送過去。
? 在傳送帶的處理上有兩個問題是要注意的,一是在初始化的時候判斷好那個已經初始化還有那個沒有初始化,
? 在傳動的時候要注意是從哪一個傳動到另一個。
? 注意在搜索的時候邊界條件的判斷。不能出界的。
?
#include<cstdio>
#include<cstring>char map[55][55];
int vis[55][55];
struct node
{int step;int row;int col;
}que[55*55];
struct gate
{char s;int row;int col;int flag;
}gate[26][2];
int dir[4][2]={0,1,0,-1,-1,0,1,0};
int T,N,M;int main()
{//freopen("1.txt","r",stdin);scanf("%d",&T);getchar();while(T--){scanf("%d%d",&N,&M);getchar();memset(vis,0,sizeof(vis));for(int i=0;i<26;i++){gate[i][0].flag =0;gate[i][0].flag =0; }int head = 0;int tail = 0;int mark =0;for(int i=0;i<N;i++){for(int j=0;j<M;j++){scanf("%c",&map[i][j]);que[tail].step =0; if(map[i][j]=='L'){map[i][j] = '#', que[tail].row =i;que[tail].col =j;que[tail].step =0;vis[i][j]=1;tail++; }if(map[i][j]>='a'&&map[i][j]<='z') {int a = (int)map[i][j]-'a'; if(gate[a][0].flag==0){gate[a][0].row = i;gate[a][0].col = j;gate[a][0].flag = 1;}else{gate[a][1].row = i; gate[a][1].col = j;gate[a][1].flag = 1; }}}getchar();}while(head<tail) {int nx = que[head].row; int ny = que[head].col;int temp = head;for(int i =0;i<4;i++){int nx2 = nx + dir[i][0];int ny2 = ny + dir[i][1]; if(nx2>=N||nx2<0||ny2>=M||ny2<0||vis[nx2][ny2]||map[nx2][ny2]=='#')continue;if(map[nx2][ny2]=='Q') {mark =1;printf("%d\n",que[temp].step+1);}if(map[nx2][ny2]=='.'){que[tail].row = nx2 ;que[tail].col = ny2 ;que[tail].step = que[temp].step+1;tail++;}else{int j = (int)map[nx2][ny2]-'a';if(nx2==gate[j][0].row&&ny2==gate[j][0].col){que[tail].row = gate[j][1].row;que[tail].col = gate[j][1].col;que[tail].step = que[temp].step+1;gate[j][1].flag =0; tail++;}else{que[tail].row = gate[j][0].row;//printf("%d",gate[j][0].row);que[tail].col = gate[j][0].col;que[tail].step = que[temp].step+1; gate[j][0].flag =0;tail++;}}vis[nx2][ny2]=1; }head++;}if(mark==0)printf("-1\n");}}
?
?
?
總結
以上是生活随笔為你收集整理的uestc oj 1002 解救小Q的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。