这道题和八数码类似,要先用find函数来找到*的位置,对其进行编辑,而不是对青蛙进行编辑,这样要求我们以下标为字符串的特殊储存结构来储存操作数,而map和unordered_map都可以做到这点,但是unordered_map运行速度更快。还得用count防止一种情况出现两次,以求得最小值。
青蛙跳杯子,具体代码如下
#include<iostream>
#include<algorithm>
#include<cstring>
#include<unordered_map>
#include<queue>
using namespace std;
string a,b;
int len;
unordered_map<string,int> d;
int bfs()
{
int idx[6]={1,-1,2,-2,3,-3};
queue<string> q;
q.push(a);
d[a]=0;
while(q.size())
{
auto t=q.front();
q.pop();
int distance=d[t];
if(t==b) return d[t];
int x=t.find("*");
for(int i=0;i<6;i++)
{
int xx=x+idx[i];
if(xx>=0&&xx<len)
{
swap(t[xx],t[x]);
if(!d.count(t))
{
d[t]=distance+1;
q.push(t);
}
swap(t[xx],t[x]);
}
}
}
return 0;
}
int main()
{
cin>>a>>b;
len=a.size();
int m= bfs();
cout<<m<<endl;
}