青蛙跳杯子
题目描述
XX 星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。
XX 星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。
如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙。
∗ WWWBBB
其中,WW 字母表示白色青蛙,BB 表示黑色青蛙,∗ 表示空杯子。
XX 星的青蛙很有些癖好,它们只做 3 个动作之一:
跳到相邻的空杯子里。
隔着 1 只其它的青蛙(随便什么颜色)跳到空杯子里。
隔着 2 只其它的青蛙(随便什么颜色)跳到空杯子里。
对于上图的局面,只要 1 步,就可跳成下图局面:
WWWBBB
本题的任务就是已知初始局面,询问至少需要几步,才能跳成另一个目标局面。
输入描述
输入为 2 行,2 个串,表示初始局面和目标局面。我们约定,输入的串的长度不超过 15。
输出描述
输出要求为一个整数,表示至少需要多少步的青蛙跳。
输入输出样例
输入
*WWBB
WWBB*
输出
2
算法分析
字符串模拟,先找到*的位置然后进行操作6个方向,每次操作完记得复原
代码实现
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
using namespace std;
string st,ed;
int n;
int dir[6]={-3,-2,-1,1,2,3};
map<string,int> dis;
int Bfs()
{
queue<string> q;
q.push(st);
dis[st]=0;
while(q.size())
{
string p=q.front();
q.pop();
int d=dis[p];
int x=p.find('*');
for(int i=0;i<6;i++)
{
int z=x+dir[i];
if(z<0||z>=n)
continue;
swap(p[x],p[z]);
if(!dis.count(p))
{
dis[p]=d+1;
if(p==ed)
return dis[p];
q.push(p);
}
swap(p[x],p[z]);
}
}
return -1;
}
int main()
{
cin>>st>>ed;
n=st.size();
cout<<Bfs()<<endl;
}