Maze(BFS处理)
生活随笔
收集整理的這篇文章主要介紹了
Maze(BFS处理)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目再現(xiàn)
題目內(nèi)容: 給你一個迷宮, S為起點,E為終點。 請你找出走出迷宮所需要花費的最短步數(shù)。 你只能往上下左右四個方向移動。輸入格式: 第一行有一個數(shù)字T,代表有T組測資。 每組測資的第一行有兩個數(shù)字R、C, 代表迷宮的大小(R x C)。 接下來R行,每行有C個字元來描述迷宮, '.'代表可以行走的路, 'X'代表不可行走的墻壁, 'S'代表起點, 'E'代表終點。 測資范圍: T < 100 2 < R,C <= 30輸出格式: 對于每組測資,計算由起點到達終點的最少步數(shù)。 測資保證一定存在至少一條由起點通往終點的路徑。 將每組測資的步數(shù)加總后再輸出。輸入樣例: 2 5 5 SXXXX ...XX .X... ..XXX ....E 6 6 ...... .S..X. XXX... ....X. .X..XX .EX...輸出樣例: 18時間限制:500ms內(nèi)存限制:32000kb算法實現(xiàn)
此題很簡單,直接BFS進行處理即可。
#include <stdio.h> #include <string.h>struct Node{int x, y;int step; };int main(){long long sum = 0;struct Node arrQue[901];int book[30][30];int T, R, C, tail, head;int i, j, startX, startY, endX, endY, tX, tY, flag;char ch;char arrMap[31][31];int next[4][2] = {{-1, 0},//上{0, 1},//右{1, 0},//下{0, -1}//左 };scanf("%d", &T);while(T --){startX = startY = endX = endY = -1;scanf("%d %d", &R, &C);//讀入地圖 for(i = 0; i < R; i ++){scanf("%s", arrMap[i]);if(startX == -1){for(j = 0; j < C; j ++){if(arrMap[i][j] == 'S'){startX = i;startY = j;}}}if(endX == -1){for(j = 0; j < C; j ++){if(arrMap[i][j] == 'E'){endX = i;endY = j;}}}}tail = head = 0;flag = 0;for(i = 0; i < R; i ++){memset(book[i], 0, sizeof(book[i]));}arrQue[tail].step = 0;arrQue[tail].x = startX;arrQue[tail].y = startY;book[startX][startY] = 1;tail ++;while(head < tail){for(i = 0; i < 4; i ++){tX = arrQue[head].x + next[i][0];tY = arrQue[head].y + next[i][1];if(tX < 0 || tY < 0 || tX >= R || tY >= C){continue;}if((arrMap[tX][tY] == '.' || arrMap[tX][tY] == 'E') && book[tX][tY] == 0){arrQue[tail].x = tX;arrQue[tail].y = tY;arrQue[tail].step = arrQue[head].step + 1;book[tX][tY] = 1;if(tX == endX && tY == endY){flag = 1;sum += arrQue[tail].step;break;}tail ++;}}head ++;if(flag == 1){break;}}}printf("%lld", sum);return 0; }博客名稱:王樂平博客
博客地址:http://blog.lepingde.com
CSDN博客地址:http://blog.csdn.net/lecepin
總結(jié)
以上是生活随笔為你收集整理的Maze(BFS处理)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS gif加载视图
- 下一篇: 用html写个人简历