码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3984 迷宫问题 --- BFS

时间:2015-12-18 13:11:10      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

 

 

技术分享
/* POJ 3984 迷宫问题 --- BFS */
#include <cstdio>

int mapn[5][5];
int x[100], y[100], pre[100];
int front = 0;//队首
int rear = 1;//队尾指向首元素的后一位
int dx[4] = { 1, -1, 0, 0 }; //4个方向
int dy[4] = { 0, 0, 1, -1 };

void printmap(int i){
    //注意pre[0]的值为-1,所以(0,0)没有输出
    if (pre[i] != -1){
        printmap(pre[i]);
        printf("(%d, %d)\n", x[i], y[i]);
    }
}

void bfs(int x0, int y0){
    x[front] = x0;
    y[front] = y0;
    pre[front] = -1;  //首元素(即左上角元素)入队

    while (front < rear){
        //队不为空时
        for (int i = 0; i < 4; ++i){
            //往四个方向广搜,判断是否可以访问
            int a = x[front] + dx[i];
            int b = y[front] + dy[i];
            if (a < 0 || a > 4 || b < 0 || b > 4 || mapn[a][b] == 1)
                continue; //无法访问的点
            else{
                mapn[a][b] = 1; //第一次访问就是最短的,访问后标记访问过(直接改为1可以省去一个visit数组)
                //满足的元素入队
                x[rear] = a;
                y[rear] = b;
                pre[rear] = front; //记录路径(最短路常用)
                ++rear;
                if (a == 4 && b == 4)
                    printmap(front); //(4,4)所在的点的下标此时并未入队,故(4,4)也未输出
            }
        }//for(i);
        ++front; //一访问过的元素出队
    }
}

int main()
{
    for (int i = 0; i < 5; ++i){
        for (int j = 0; j < 5; ++j){
            scanf("%d", mapn[i] + j);
        }//for(j)
    }//for(i)
    printf("(0, 0)\n");
    bfs(0, 0);
    printf("(4, 4)\n");

    return 0;
}
View Code

 

POJ 3984 迷宫问题 --- BFS

标签:

原文地址:http://www.cnblogs.com/tommychok/p/5056679.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!