Search Special - wide search

The shortest road width search

/**
*BFS
*poj 2376
*@author Hongchuan CAO
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<queue>
#include<stack>

using namespace std;

int maze[5][5];  //迷宫输入
bool use[5][5];  //是否搜索过
int pos[4][2] = {{1,0},{0,1},{0,-1},{-1,0}};  //移动方向

class Node{
    public:
        int x,y;
        Node() = default;
        Node(int x,int y){
            this->x = x;
            this->y = y;
        }
};

Node pre[5][5];   //记录前驱 (用于路径输出)

void get_data(){
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            scanf("%d",&maze[i][j]);
            use[i][j] = false;
            pre[i][j] = Node(-1,-1);
        }
    }
}

void solve(){
    queue<Node> que;
    que.push(Node(0,0));
    
    while(!que.empty()){
        Node cur = que.front();
        que.pop();
        for(int i=0;i<4;i++){
            Node move;
            move.x = cur.x + pos[i][0];
            move.y = cur.y + pos[i][1];
            if(move.x>=0&&move.x<=4&&move.y>=0&&move.y<=4&&!use[move.x][move.y]&&maze[move.x][move.y]==0){
                use[move.x][move.y] = true;
                que.push(Node(move.x,move.y));
                pre[move.x][move.y] = Node(cur.x,cur.y);
            }
        }
        if(use[4][4]) break;
    }


	//利用栈,将路径顺序输出
    stack<Node> sta;  
    int prex = 4, prey = 4;
    while(prex!=0||prey!=0){
        sta.push(Node(prex,prey));
        int _prex = prex, _prey = prey;
        prex = pre[_prex][_prey].x;
        prey = pre[_prex][_prey].y;
    }
    sta.push(Node(0,0));

    while(!sta.empty()){
        Node curr = sta.top();
        sta.pop();
        printf("(%d, %d)\n",curr.x,curr.y);
    }

}
int main(){
    get_data();
    solve();
    system("pause");
    return 0;
}

Guess you like

Origin blog.csdn.net/baidu_41560343/article/details/93134772