题目再现
题目内容:
给你一个迷宫,
S为起点,E为终点。
请你找出走出迷宫所需要花费的最短步数。
你只能往上下左右四个方向移动。输入格式:
第一行有一个数字T,代表有T组测资。
每组测资的第一行有两个数字R、C,
代表迷宫的大小(R x C)。
接下来R行,每行有C个字元来描述迷宫,
'.'代表可以行走的路,
'X'代表不可行走的墙壁,
'S'代表起点,
'E'代表终点。
测资范围:
T < 100
2 < R,C <= 30输出格式:
对于每组测资,计算由起点到达终点的最少步数。
测资保证一定存在至少一条由起点通往终点的路径。
将每组测资的步数加总后再输出。输入样例:
2
5 5
SXXXX
...XX
.X...
..XXX
....E
6 6
......
.S..X.
XXX...
....X.
.X..XX
.EX...输出样例:
18时间限制:500ms内存限制:32000kb
算法实现
此题很简单,直接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