码迷,mamicode.com
首页 > 其他好文 > 详细

迷宫bfs+路径记录

时间:2019-09-01 13:06:08      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:需要   main   return   ace   ios   include   理解   cpp   cst   

给定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;
}

迷宫bfs+路径记录

标签:需要   main   return   ace   ios   include   理解   cpp   cst   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!