POJ-3984-迷宫问题-BFS(广搜)-手写队列

来源:互联网 发布:淘宝上1元秒杀是真的吗 编辑:程序博客网 时间:2024/04/30 08:27

题目链接:http://poj.org/problem?id=3984

这个本来是个模板题,但是老师要去不能用STL里的queue,得自己手写解决,ORZ....看别人的博客学习,新技能get。。。

#include<iostream>#include<string>#include<cstdio>#include<cstring>#include<queue>#include<map>#include<stack>#include<set>#include<vector>#include<algorithm>#define LL long longusing namespace std;int Map[10][10];int last=0,total=1;         //  total为队列总元素,last为先驱标记;int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}};struct node{    int x,y,pre;}q[30];bool Isok(int x,int y)      //  判断时候在迷宫内部,决定时候继续往下搜;{    if(x<0||y<0||x>4||y>4||Map[x][y]) return false;    else return 1;}void print(int i)           //  自定义输出函数,调用递归,利用递归原理可以很轻松的从后往前输出;{    if(q[i].pre!=-1){       //  先驱为-1位起点;        print(q[i].pre);        printf("(%d, %d)\n",q[i].x,q[i].y);    }}void bfs(int x,int y){    q[last].x=x;    q[last].y=y;    q[last].pre=-1;                 //  起点,先驱标记为-1;    while(last<total){              //  判断队列是否为空;        for(int i=0;i<4;i++){       //  四个方向搜索;            int a=q[last].x+dir[i][0];            int b=q[last].y+dir[i][1];            if(Isok(a,b)){                //cout<<a<<' '<<b<<endl;                Map[a][b]=1;                q[total].x=a;                q[total].y=b;                q[total].pre=last;  //  记录先驱;                total++;            //  入队;            }            if(a==4&&b==4){                print(last);            }        }        last++;         //  出队;    }}int main(){    for(int i=0;i<5;i++){        for(int j=0;j<5;j++){            scanf("%d",&Map[i][j]);        }    }    printf("(0, 0)\n");    bfs(0,0);    printf("(4, 4)\n");    return 0;}


 

0 1
原创粉丝点击