题目:青蛙跳杯子;
思路:字符串模拟,先找到*的位置然后进行操作6个方向,每次操作完记得复原,主要就是用BFS去写
#include<bits/stdc++.h>
using namespace std;
string a,b;
int n;
map<string,int> dis;//创建一个map来储存键值对
int f[]={-3,-2,-1,1,2,3};
int bfs()
{
queue<string> q;
q.push(a);
dis[a]=0;
while(q.size())
{
string x = q.front();
q.pop();
int d = dis[x];
int y=x.find('*');//找*的位置
for(int i=0;i<6;i++)
{
int t=y+f[i];//找到之后开始从六个方向遍历
if(t<0||t>=n) continue;//剪枝,避免大量的重复
swap(x[y],x[t]);//交换两个字符的位置
if(!dis.count(x))
{
dis[x]=d+1;
if(x==b) return dis[x];//找到后就返回值
q.push(x);
}
swap(x[y],x[t]);//完事之后,还要再换回来
}
}
return -1;//没有就返回-1;
}
int main()
{
cin>>a>>b;
n=a.size();
cout<<bfs();
return 0;
}