3.10-跳蚱蜢-广度优先搜索

通过广度优先搜索解决蚱蜢在圆圈盘子上重新排列的问题,寻找最少的跳跃次数以改变其排列顺序。

有9只盘子,排成1个圆圈。
其中8只盘子内装着8只蚱蜢,有一个是空盘。
我们把这些蚱蜢顺时针编号为 1~8

每只蚱蜢都可以跳到相邻的空盘中,
也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。

请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列,
并且保持空盘的位置不变(也就是1-8换位,2-7换位,…),至少要经过多少次跳跃?
这里写图片描述

简要分析

这道题广度优先搜索和深度优先搜索均可实现,但是这道题需要求出最短步数,所以显然广度优先搜索能更快的达到目标(因为第一个结果即为所求答案)
并且深度搜索容易进入死循环!!

#include<iostream>
#include<queue>
#include<string>
#include<map>
using namespace std;
const string st="012345678";
const string ed="087654321";
queue<pair<pair<string,int>,int> > que;//从左到右依次为:当前各位置的蚂蚱编号、空位位置、当前步数 
const int d[5]={1,2,7,8}; 
map<string,string> parent;//记录当前状态的前一个状态 
int main()
{
    int ans;
    parent[st]="";
    que.push(make_pair(make_pair(st,0),0));
    while(!que.empty())
    {
        string temstr=que.front().first.first;
        int tempos=que.front().first.second;
        int temcou=que.front().second;
        if(temstr==ed)
        {
            ans=temcou;
            break;
        }
        que.pop();
        for(int i=0;i<4;i++)
        {
            string y=temstr;
            swap(y[tempos],y[(tempos+d[i])%9]);
            if(parent.count(y)==0)//返回指定元素出现的次数
            {
                parent[y]=temstr;
                que.push(make_pair(make_pair(y,(tempos+d[i])%9),temcou+1));
            }

        }
    }
    cout<<ans;
    //打印路径 
    for (string now = ed; now != ""; now = parent[now]) {  
        printf("%s\n", now.c_str());  
    }  
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值