七月十七日 学习笔记

广度优先搜索

使用队列,反复取出队首元素,将该顶点可达到的未曾加入过队列的顶点全部入队,直到队列为空时遍历结束。

POJ - 3984 迷宫问题

需要用到广度优先搜索

先写头文件

#include<stdio.h>
#include<cstring>
#include<queue>
using namespace std;

在定义变量,结构体

其中结构体包括的内容有坐标、步数还有结构体变量

int map[6][6];
int vis[6][6];
int len,i,j;
int dir[4][2]{{0,1},{0,-1},{1,0},{-1,0}};
int x1;
int y1;
struct node{
	int x;
	int y;
	int step;
	int num[50];
};
node ans;

接着就是要写函数了,这次定义的函数有点不同,它是一个能返回结构体的函数,类型名是刚刚定义的结构体的

名字

node  bfs()
{
    memset(vis,0,sizeof(vis));
    queue<node>q;
    node a,b;
    a.x=0;
    a.y=0;
    a.step=0;
    vis[0][0]=1;
    q.push(a);
    while(!q.empty())
    {
        a=q.front();
        q.pop();
        if(a.x==4&&a.y==4)
        {
           // len=a.step;
            //prinf(a);
            return a;
        }
        for(i=0;i<4;i++)
        {
            b=a;
            b.x=a.x+dis[i][0];
            b.y=a.y+dis[i][1];
            if(vis[b.x][b.y]||a1[b.x][b.y]==1)
                continue;
            if(b.x>=0&&b.x<5&&b.y>=0&&b.y<5)
            {
                 vis[b.x][b.y]=1;
                b.step=a.step+1;
                //printf(" %d ",b.step); 
                b.num[a.step]=i;
                //printf("%d\n",b.num[a.step]);
                q.push(b);

            }
        }
        //printf("\n");
    }
    return a;
}

字符数组vis[]表示的是是否走过,通过memset()将vis[]的元素全部设为0;对结构体a进行初始化,因为从(0,0)开始出发,所以出发点已经访问过了;将结构体a入队,while循环,如果队列不为空,说明还没有走到终点,让a出队,如果走到右下角了,就返回a;b结构体的作用是储存a走下一步的结果坐标;如果已经走过或是遇到墙了,就跳过此操作;若没超过边界,就将b的坐标标记为已经访问过,b继承a的步数并加一,数组存上对应的数,这个数表示如何走;返回的a的数组中就包含了该怎么走的信息

prinf()将这些信息转化为坐标输出

void prinf(node w)
{
    for(i=0;i<=w.step;i++)
    {

        printf("(%d, %d)\n",x1,y1);
        if(i!=w.step)
        {
            x1+=dis[w.num[i]][0];
            y1+=dis[w.num[i]][1];
        }
    }
}

猜你喜欢

转载自blog.csdn.net/Helloirbd/article/details/81085042
今日推荐