迷宫bfs+路径记录

给定5*5的地图,1表示墙,0表示空地,从左上角走到左下角

是把所有的可走路径都记录下来了,但是
搜索有递归与非递归形式

本代码使用非递归形式
bfs+路径记录

对于num[i].pre=head的理解是他存在很多条路,每个点是从上一个点走过来的,但总存在一条路是到达终点的,所以,只需要得到到终点的一个head就可以顺着这个路径标记回去了

#include <iostream>
#include <cstdio>
using namespace std;
char a[10][10];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
struct node{
    int x,y;
    int pre;
}num[1200];
void print(int n){//输出路径,当xx与yy到达终点的时候,就把head传入,
    if(num[n].pre != -1){
        print(num[n].pre);
        printf("(%d, %d)\n",num[n].x,num[n].y);
    }
}
void bfs(){
    int head=0;
    int rear=0;
    num[rear].x=0,num[rear].y=0,num[rear++].pre=-1;//初始路径记录
    while(head<rear){
        for(int i=0;i<4;i++){
            int xx=num[head].x+dir[i][0];
            int yy=num[head].y+dir[i][1];
            if(xx>=5||xx<0||yy>=5||yy<0||a[xx][yy]==1)continue;
            a[xx][yy]=1;//标记走过了
            num[rear].x=xx;
            num[rear].y=yy;
            num[rear].pre=head;
            rear++;//rear的值一只增加,只要一个点的4个方向存在空地
            if(xx==4&&yy==4)print(head);
        }
        head++;

    }
}
int main(){
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            scanf("%d",&a[i][j]);
        }
    }
    printf("(0, 0)\n");
    bfs();
    printf("(4, 4)\n");

    return 0;
}

原文地址:https://www.cnblogs.com/Emcikem/p/11441721.html

时间: 2024-11-06 09:51:25

迷宫bfs+路径记录的相关文章

HDU 1104 Remainder(BFS路径记录+数论)

Remainder Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4337    Accepted Submission(s): 1095 Problem Description Coco is a clever boy, who is good at mathematics. However, he is puzzled by a d

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/路径记录】

迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 31428 Accepted: 18000 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 - 3414 Pots (BFS+路径记录)

题目链接:http://poj.org/problem?id=3414 题意:两个空杯子倒水,使得任意一个杯子中的水量达到题目要求,有6种操作:装满a,装满b,倒掉a,倒掉b,a->b,b->a. 题解:模拟一下操作,就好了. 1 #include <queue> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7

poj 3414 pots (bfs+路径记录)

Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11703   Accepted: 4955   Special Judge Description You are given two pots, having the volume of A and B liters respectively. The following operations can be performed: FILL(i)        f

POJ-3894 迷宫问题 (BFS+路径还原)

定义一个二维数组: 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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线. Input 一个5 × 5的二维数组,表示一个迷宫.数据保证有唯一解. Output 左上角到右下角的最短路径,格式如样例所示. Sample Input 0

[bfs+余数判重+路径记录] hdu 4474 Yet Another Multiple Problem

题意: 给一个n和m个数字(一位数) 求最小的n的倍数不含有这m个数字,不存在输出-1 思路: 首先有可能这个数超long long 所以无法暴力解决 所以这题应该是一个bfs 为什么能用余数判重呢 对于当前的余数进到队列里,一定是这个余数对应数的最小值 接下来再怎么添加到满足条件的后续东西应该是一样的 所以就可以余数判重了,类似数位dp的记录方式 然后再加上一个路径记录就好了 代码: #include"cstdlib" #include"cstdio" #incl

寻找一条通过迷宫的路径

试编写一个程序寻找一条通过迷宫的路径. 一个迷宫可以看成是一个矩阵(数组),它有一个入口单元和一个出口单元,图中阴影处表示障碍物,白格表示可以通行的道路.只能从入口进去,从出口出去,中间只能通过白格子(即只能从一个白格单元走到一个相邻的白格单元,相邻指上.下.左.右四个单元),遇见死路时,退回去重找其它路.用户可设入口处(1,1)为2,出口位置(5,6)为-1,白格处送入0,障碍物位置送入1. 上代码: 1 #include <stdio.h> 2 3 int matrix[6][6] = 4

poj3414 Pots(BFS+路径输出)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=3414 此题和poj1606一样 :http://blog.csdn.net/u012860063/article/details/37772275 Description You are given two pots, having the volume of A and B liters respectively.