Maze(BFS处理)

题目再现

题目内容:
给你一个迷宫,
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

你可能感兴趣的:(C语言,bfs)