POJ 3984 迷宮問題 (BFS + Stack)
阿新 • • 發佈:2017-11-29
while read 輸出 目標 ted ring 節點 fin mar
鏈接 : Here!
思路 : BFS一下, 然後記錄下每個孩子的父親用於找到一條路徑, 因為尋找這條路徑只能從後向前找, 這符合棧的特點, 因此在輸出路徑的時候先把目標節點壓入棧中, 然後不斷的向前尋找, 最後直接pop出棧中所有的元素即可.
註意 : 不要把局部變量壓入棧中, 這樣就直接段錯誤了? ??
/*************************************************************************
> File Name: 3984-迷宮問題.cpp
> Author:
> Mail:
> Created Time: 2017年11月29日 星期三 19時28分22秒
************************************************************************/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
#define MAX_N 10
int G[MAX_N][MAX_N];
int vis[MAX_N][MAX_N] = {0};
int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};
struct Point {
Point() {}
Point(int x, int y, Point *father) : x(x), y(y), father(father) {}
int x, y;
Point *father;
};
void read() {
for (int i = 0 ; i < 5 ; ++i) {
for (int j = 0 ; j < 5 ; ++j) {
scanf("%d", &G[i][j]);
}
}
}
bool check(Point pt) {
if (pt.x < 0 || pt.x >= 5 || pt.y < 0 || pt.y >= 5 || vis[pt.x][pt.y] || (G[pt.x][pt.y] == 1)) return false;
return true;
}
void solve() {
Point st(0, 0, NULL), last_pt;
Point pt[MAX_N * MAX_N];
int ind = 0;
queue<Point> que;
que.push(st);
vis[st.x][st.y] = 1;
while (!que.empty()) {
pt[ind] = que.front();
que.pop();
Point *now = &pt[ind];
last_pt = pt[ind];
++ind;
for (int i = 0 ; i < 4 ; ++i) {
int tx = now->x + dx[i];
int ty = now->y + dy[i];
if (!check(Point(tx, ty, NULL))) continue;
pt[ind].x = tx;
pt[ind].y = ty;
pt[ind].father = now;
vis[pt[ind].x][pt[ind].y] = 1;
que.push(pt[ind]);
++ind;
}
}
stack<Point *> myStack;
Point *p = &last_pt;
while (p->father != NULL) {
myStack.push(p);
p = p->father;
}
printf("(0, 0)\n");
while (!myStack.empty()) {
p = myStack.top();
myStack.pop();
printf("(%d, %d)\n", p->x, p->y);
}
}
int main() {
read();
solve();
return 0;
}
POJ 3984 迷宮問題 (BFS + Stack)