题目再现
题目内容:
给你一个迷宫,
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;
}
博客名称:王乐平博客