欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

POJ - 3984 迷宫问题

程序员文章站 2022-05-20 21:37:34
...

打印路径的迷宫问题,根据bfs来说,队尾是由队首得到的,所以我们只需要加一个映射,让队尾映射到队首。用函数提供的queue函数比较法麻烦,需要建立指针,所以自己手撕了一个队列,用l和r表示边界,代码如下

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <map>
#include <cstdio>

using namespace std;

int l = 0, r = 0;
int used[10][10];
int M[10][10];
int flag[500];
int cx[4] = {0, 0, -1, 1},
    cy[4] = {1, -1, 0, 0};

struct ll{
    int x, y;
};

map<int, ll> p;

bool check(int x, int y)
{
    if(x >= 0 && x < 5 && y >= 0 && y < 5 && !used[x][y] && M[x][y] == 0)
        return 1;
    return 0;
}

void BFS()
{
    ll f, s;
    f.x = 0;
    f.y = 0;
    p[r] = f;
    while(l <= r) {
        f = p[l];
        if(f.x == 4 && f.y == 4) {
            break;
        }
        for(int i = 0; i < 4; i++) {
            s.x = f.x + cx[i];
            s.y = f.y + cy[i];
            if(check(s.x, s.y)) {
                p[++r] = s;
                flag[r] = l;
                used[s.x][s.y] = 1;
            }
        }
        l++;
    }
}

void ANS(int t)
{
    if(flag[t])
        ANS(flag[t]);
    printf("(%d, %d)\n", p[t].x, p[t].y);
}

int main()
{
    for(int i = 0; i < 5; i++) {
        for(int j = 0; j < 5; j++) {
            cin >> M[i][j];
        }
    }
    BFS();
    printf("(0, 0)\n");
    ANS(l);
    return 0;
}