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

题目链接: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 long
using 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;
}
时间: 2024-10-07 17:43:43

POJ-3984-迷宫问题-BFS(广搜)-手写队列的相关文章

poj 3984:迷宫问题(广搜,入门题)

迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要

POJ 3984 迷宫问题 bfs

题目链接:迷宫问题 天啦撸.最近怎么了.小bug缠身,大bug 不断.然这是我大腿第一次给我dbug.虽然最后的结果是.我............bfs入队列的是now.............. 然后.保存路径的一种用的string .一种用的数组.大同小异.根据就是我bfs 先搜到的绝壁就是步数最少的. 附代码: pre 数组 1 /* 2 很简单的广搜.如果不是+路径输出的话.. 3 保存路径. 4 */ 5 6 #include <stdio.h> 7 #include <str

POJ 3984 迷宫问题 bfs 难度:0

http://poj.org/problem?id=3984 典型的迷宫问题,记录最快到达某个点的是哪个点即可 #include <cstdio> #include <cstring> #include <queue> using namespace std; const int maxn=10; const int inf=0x3fffffff; struct pnt { int x,y; pnt(){x=y=0;} pnt(int tx,int ty){x=tx,y

POJ 3984:迷宫问题(BFS+路径记录)

迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7560   Accepted: 4426 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要

POJ - 3984 迷宫问题 bfs解法

#include<stdio.h> #include<string.h> #include<algorithm> #include<stack> using namespace std; int a[5][5],b[5][5]; int di[4][2]={0,1,0,-1,1,0,-1,0}; void bfs(int x,int y) { int tx=x,ty=y,i; if(a[x][y]==0) { a[x][y]=1; for(i=0;i<

POJ 3984 迷宫问题 (BFS + Stack)

链接 : Here! 思路 : BFS一下, 然后记录下每个孩子的父亲用于找到一条路径, 因为寻找这条路径只能从后向前找, 这符合栈的特点, 因此在输出路径的时候先把目标节点压入栈中, 然后不断的向前寻找, 最后直接pop出栈中所有的元素即可. 注意 : 不要把局部变量压入栈中, 这样就直接段错误了? ?? /************************************************************************* > File Name: 3984-迷宫

POJ 3984 迷宫问题 BFS+路径保存

题目链接: 思路:STL果然不是万能的..写了一个下午... 改用普通数组写一会便过了..真坑.. 主要就是建立一个保存前驱的数组 代码: #include <iostream> #include <cstdio> #include <queue> using namespace std; int a[6][6]; int go[4][2] = {1,0,0,1,-1,0,0,-1}; struct node { int x; int y; }q[100]; int p

BFS(最短路+路径打印) POJ 3984 迷宫问题

题目传送门 1 /* 2 BFS:额,这题的数据范围太小了.但是重点是最短路的求法和输出路径的写法. 3 dir数组记录是当前点的上一个点是从哪个方向过来的,搜索+,那么回溯- 4 */ 5 /************************************************ 6 Author :Running_Time 7 Created Time :2015-8-4 9:02:06 8 File Name :POJ_3984.cpp 9 ********************

hdu1240/poj2225 BFS广搜的再理解

原题地址 HDUOJ POJ 题目介绍 题意 这同样是一道搜索题,所不同的是要搜索的图是三维的而不是二维的.但这并没什么大的改变,只是增加了两个搜索的方向而已. 陷阱 要注意的地方是,所给出的起点终点的坐标是按照 列,行,层的顺序. 关于BFS 与DFS不同,BFS能保证所搜到的路径一定是最短路径,所以我们不需要维护一个多维(此处为3维)数组来记录访问到每一点的最小步数,只需要维护一个多维数组来标记是否走过就可以了.DFS中是要不停回溯来找最短路径的,但是BFS是不需要的.这是BFS本身的性质所