迷宫问题 POJ - 3984

Description:

定义一个二维数组:

int maze[5][5] = {

0, 1, 0, 0, 0,

0, 1, 0, 1, 0,

0, 0, 0, 0, 0,

0, 1, 1, 1, 0,

0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

Input:

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

Output:

左上角到右下角的最短路径,格式如样例所示。

Sample Input:

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

Sample Output:

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

这道题乍一看有种感觉不适合bfs,但是题目上又强调了有唯一解,这说明根据节点的前驱去把整条路径拖出来会很简单。所以还是要用bfs来写。

Code:

#include <iostream>
#include <queue>
#include <cstdio>


using namespace std;

typedef struct MAZ {

    int px;
    int py;
}Maz;
Maz a[5][5]; //存下每个点的前驱

queue<Maz> que;

int maz[5][5];

void print(){
    int x=4, y=4;
    Maz ans[26]; int i=0;
    //cout << a[x][y].px <<',' << a[x][y].py << endl;
    while ( x != a[x][y].px || y!=a[x][y].py ) {
        ans[i].px = a[x][y].px;
        ans[i].py = a[x][y].py;
        x = ans[i].px;
        y = ans[i].py;
        i++;
    }
    while (i--) {
        printf("(%d, %d)",ans[i].px,ans[i].py);
         if (i) cout << endl;
    }
    cout << endl;
    printf("(4, 4)\n");
}

bool judege(int x, int y){
    if( maz[x][y] ==0 && x >= 0 && x < 5 && y >=0 && y <5  )
        return true;
    else return false;
}

void  push(int x, int y, int px ,int py){
    Maz t;
    t.px = x;
    t.py = y;
    que.push(t);
    a[x][y].px = px;
    a[x][y].py = py;
    maz[x][y] += maz[px][py]+1;
//    printf("(%d,%d)\n",x,y ); //显示拓展顺序
}

int main() {

    for (int i = 0; i < 5 ; i++)
        for(int j = 0 ;j < 5; j++){
            cin >> maz[i][j];
            if( maz[i][j] == 1 ) maz[i][j] = -1;
        }
    maz[0][0] = 1;
    Maz temp;
    push(0,0,0,0);
    while ( !que.empty() ) {
        temp = que.front();
        que.pop();
        if (judege(temp.px+1, temp.py)){
            push(temp.px+1, temp.py, temp.px, temp.py);
        }
        if (judege(temp.px-1, temp.py)){
            push(temp.px-1, temp.py, temp.px, temp.py);
        }
        if (judege(temp.px, temp.py+1)){
            push(temp.px, temp.py+1, temp.px, temp.py);
        }
        if (judege(temp.px, temp.py-1)){
            push(temp.px, temp.py-1, temp.px, temp.py);
        }
    }
    print();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值