POJ -- 3984 迷宮問題

很簡單的寬搜問題,打印路徑的時候須要遞歸。數組

代碼用了數組表示上下左右,可是易讀性降低了挺多。spa

#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int maze[10][10];
int vis[30];
int prex[30], prey[30];
int delta[][2] = {
    {
        1, 0
    },
    {
        -1, 0
    },
    {
        0, 1
    },
    {
        0, -1
    }
};
void printpath(int x, int y)
{
    if(x || y)
        printpath(prex[x*5+y], prey[x*5+y]);
    printf("(%d, %d)\n", x, y);
}

queue<int> q;
void bfs()
{
    q.push(0*5+0);
    vis[0*5+0] = 1;
    prex[0*5+0] = 0; prey[0*5+0] = 0;
    while(!q.empty())
    {
        int a = q.front(); q.pop();
        int x = a / 5, y = a % 5;
        if(x == 4 && y == 4) break;
        for(int i = 0; i < 4; i++)
        {
            int _x = x + delta[i][0];
            int _y = y + delta[i][1];
            if(_x >= 0 && _x < 5 && _y >= 0 && _y < 5 && !maze[_x][_y] && !vis[_x*5+_y])
            {
                q.push(_x*5+_y);
                vis[_x*5+_y] = 1;
                prex[_x*5+_y] = x; prey[_x*5+_y] = y;
            }
        }
    }
    printpath(4, 4);
}

int main()
{
    for(int i = 0; i < 5; i++)
    for(int j = 0; j < 5; j++)
        scanf("%d", &maze[i][j]);
    bfs();
    return 0;
}
相關文章
相關標籤/搜索