题目描述
X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。
X球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙。
*WWWBBB
其中,W字母表示白色青蛙,B表示黑色青蛙,*表示空杯子。
X星的青蛙很有些癖好,它们只做3个动作之一:
1.跳到相邻的空杯子里。
2.隔着 1只其它的青蛙(随便什么颜色)跳到空杯子里。
3.隔着 2只其它的青蛙(随便什么颜色)跳到空杯子里。
对于上图的局面,只要1步,就可跳成下图局面:
WWW *BBB
本题的任务就是已知初始局面,询问至少需要几步,才能跳成另一个目标局面.
输入描述
输入为2行,2个串,表示初始局面和目标局面。我们约定,输入的串的长度不超过 15。
输出描述
输出要求为一个整数,表示至少需要多少步的青蛙跳。
这道题其实是一道bfs模板题,八数码和九宫格都用到了此方法
#include <iostream>
#include<unordered_map>
#include<queue>
#include<string>
using namespace std;
int ne[6]={-3,-2,-1,3,2,1};//方向数组存储6种移动方式
string start,end_;
int bfs()
{
queue<string> q;
q.push(start);//先将初始状态入队
unordered_map<string,int> d;//记录走到每种状态所需的步数
d[start]=0;
int n=start.size();
while(q.size())
{
string t=q.front();q.pop();
int distance=d[t];
if(t==end_) return distance;
int x=t.find('*');//寻找空杯的位置
for(int i=0;i<=5;i++)
{
int x1=x+ne[i];
if(x1>=0&&x1<n)
{
swap(t[x1],t[x]);//交换位置,得到新的状态
if(!d.count(t))//因为要求最少步数,所以不能走已经走过的路
{
d[t]=distance+1;
q.push(t);
}
swap(t[x1],t[x]);//恢复原始状态
}
}
}
return 0;
}
int main()
{
// 请在此输入您的代码
cin>>start>>end_;
cout<<bfs();
return 0;
}