广搜 基础 走迷宫 记录路径

来源:互联网 发布:国产凌凌漆 知乎 编辑:程序博客网 时间:2024/05/16 10:52
###############################
Origin:POJ3984
Type:BFS
##############################
#include <iostream>#include <cstdio>#include <stack>#include <queue>#include <cstring>#define N 5using namespace std;const int dx[4] = {0, 0, -1, 1};const int dy[4] = {-1, 1, 0, 0};int fa[N][N], grid[N][N];bool vis[N][N];inline bool inbound (int x, int y){    return (0<=x && x<N && 0<=y && y<N);}void bfs(int start, int aim){    int x = start / N, y = start % N;    fa[x][y] = start;    vis[x][y] = true;    queue<int>q;    q.push(start);    while (!q.empty()){        int temp = q.front();        q.pop();        x = temp / N, y = temp % N;        int nx, ny;        for (int i=0; i<4; i++){            nx = x + dx[i];            ny = y + dy[i];            if (inbound(nx, ny) && !grid[nx][ny] && !vis[nx][ny]){                fa[nx][ny] = temp;                int a = nx * N + ny;                if (a == aim) return ;                q.push(a);                vis[nx][ny] = 1;            }        }    }}void trace(int aim){    int x =aim/N,y =aim%N,fx,fy;    stack<int> dir;    dir.push (aim);    while (1){        fx = fa[x][y] / N;        fy = fa[x][y] % N;        if (fx == x && fy == y) break;        dir.push(fa[x][y]);        x = fx, y = fy;    }    while (!dir.empty()){ printf("(%d, %d)\n",dir.top()/N,dir.top()%N);     dir.pop();    }}int main(){  for(int i=0; i<N; i++)    for(int j=0; j<N; j++)        scanf("%d",&grid[i][j]);    memset(vis, 0, sizeof(vis));    memset(fa, 0, sizeof(fa));    bfs(0, N*N-1);    trace(N*N-1);    return 0;}

0 0
原创粉丝点击