dfs与bfs解决迷宫类问题(两者的区别)

dfs解决迷宫问题(dfs的入门应用)

下面是对应代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int min=9999999;					
int c[4][2]={{1,0},{0,1},{-1,0},{0,-1}};	//这里是定义的四个方向,上下左右
int n;
int s[1000][1000];		//一个足够容纳迷宫的二维数组
void dfs(int x,int y,int step)		//dfs接受坐标和当前步数	
{
    int i,xn,yn;
    if(x==n-1&&y==n-1)				//一定要把结束条件放在前面,先判断是否结束
    {								//这里判断是否到达终点
        if(step<min)				//判断步数是否小于当前最小步数
            min=step;
        return;
    }
    for(i=0; i<4; i++)		//因为有四个方向可以走,所以这里循环4次,四种情况
    {
        xn=x+c[i][0];	//这里一定要把走过之后的x,y给一个新的变量(比如这里的xnyn)		
        yn=y+c[i][1];	//因为要以原来的位置为中心向上下左右分别测试走,所以原来的位置不能改变。
        if(xn<0||xn>=n||yn<0||yn>=n)	//判断是否出界
        {
            continue;					//如果出界,跳过这一步,进入下一步
        }
        if(s[xn][yn]==0)			//判断是否是能走的路
        {
            s[xn][yn]=1;				//如果能走,把上一步标记为墙以防重复	
            dfs(xn,yn,step+1);			//进入下一步	
            s[xn][yn]=0;			//回溯,回来的时候把之前走过的还变成路
        }
    }
    return;
}
int main()
{
    int i,j;
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            scanf("%d",&s[i][j]);
        }
    }
    dfs(0,0,0);
    printf("%d",min);					//输出最小步数
}

dfs无法处理没有对应路径的情况,而且在有些情况下时间复杂度很高;
改用bfs能处理这一问题:

int BFS(int start_x, int start_y, int row, int col)
{
	Node *head,*tail,*p,*target;
	int x,y, step,i,j,xn,yn;
	int road;
	int visited[row][col];
	for(i=0;i<row;i++)  //初始化
	{
		for(j=0;j<col;j++)
		{
			visited[i][j]=0;
		}
	}
	visited[start_x][start_y]=1;
	Queue que;
	que.head = NULL;
	que.tail = NULL;
	que.size = 0;
	enQueue(&que,start_x,start_y,0);
	while(que.size>0)
	{
		target = que.head;  //出队
		x = target->x;
		y = target->y;
		step = target->step;
		que.head = target->next;
		que.size -= 1;
		free(target);
        for(i=0;i<4;i++)
        {
            xn=x+dir[i][0];
            yn=y+dir[i][1];
            if(xn<row&&xn>=0&&yn<col&&yn>=0&&visited[xn][yn]==0)  //判断是否出界
            {
                road=maze[xn][yn];
                visited[xn][yn]=1;
                if(road==0)
                {
                    enQueue(&que,xn,yn,step+1);
                }
                else
                {
                    if(road==4)
                    {
                        return step+1;  //最小值就是最先return的那个值,不用进行比较
                    }
                }
            }
            else
            {
                continue;
            }
        }
	}
	return -1;   //当所有路径都无法return step+1的时候 执行return -1,表示无法到达
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值