回溯法-bfs--迷宫问题的最短路径

迷宫问题怎样才可以得到最短路径:

这里有测试案例:

0-通路,-1为墙,输入为:

测试经过计算机跑过--为:

这样其最短路径为:

核心算法为:

findpath(int ** map,constint &start_x,constint &start_y)

{

    int m=start_x,n=start_y;

    Queue Q;

    iniqueue(&Q);

    map[m][n]=1;

    //表示已经走过了;

    node *p=(node *)malloc(sizeof(node));

    p->x=m;

    p->y=n;

    p->steps=0;

    Enqueue(&Q, p);

    node *s=(node*)malloc(sizeof(node));

    node *temp=(node*)malloc(sizeof(node));

    while(Q.size!=0)

    {

        Dequeue(&Q,s);

        if(s->x==N-1&&s->y==M-1)

            break;

        

        for(int k=0;k<4;k++)

        {

            temp->x=s->x+x[k];

            temp->y=s->y+y[k];

//方向选择,如果符合通路,入队

            if(check(temp->x, temp->y)==0&&map[temp->x][temp->y]==0)

                {

//check函数防止其中边界,不出边界返回为0

                    temp->steps=s->steps+1;

                    map[temp->x][temp->y]=temp->steps;

                    Enqueue(&Q, temp);

                }

        }

    }

}
大家在思考一下怎样打印最短路径,当然是利用回溯法,这样也会非常简单,就会知道,要打印它,就只需要知道它的前驱节点,这样打印不会出错。打印其实可以参考我的前面的回溯迷宫问题的核心算法,这里的steps其实就是一个index,很好解决问题。
希望各位前辈多多指教。
加上一个测试完整案例:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值