思路:
观察到数据范围为15,而且青蛙又有三种动作,进而想到这是一个bfs.由于 ‘*’空杯子是唯一的,所以我们每次就从‘*’来考虑青蛙的动作是否可行(即从空杯子来跳到青蛙那里),那么最多只有六种情况。
队列中最多有2^15 * 6 个串,复杂度是可以满足的.注意所有字符串只进队一次,所以需要对字符串去重,这个过程用set 或map 记录一下即可。
#include<bits/stdc++.h>
using namespace std;
struct node
{
string ss;
int pos;
int step;
node(string _ = "",int x = 0,int y = 0)
{
ss = _,pos = x,step = y;
}
};
string s,t;
map<string,int>mp;
int bfs()
{
queue<node>Q;
mp.clear();
while(!Q.empty()) Q.pop();
int rot = s.find('*');
Q.push(node(s,rot,0));
mp[s] = 1;
while(!Q.empty())
{
node q = Q.front();
Q.pop();
cout << q.ss << endl;
if(q.ss == t)
return q.step;
if(q.pos - 1 >= 0)
{
string tmp = q.ss;
swap(tmp[q.pos - 1],tmp[q.pos]);
if(!mp[tmp])
{
mp[tmp] = 1;
Q.push(node(tmp,q.pos - 1,q.step + 1));
}
}
if(q.pos - 2 >= 0)
{
string tmp = q.ss;
swap(tmp[q.pos-2],tmp[q.pos]);
if(!mp[tmp])
{
mp[tmp] = 1;
Q.push(node(tmp,q.pos - 2,q.step + 1));
}
}
if(q.pos -3 >= 0)
{
string tmp = q.ss;
swap(tmp[q.pos-3],tmp[q.pos]);
if(!mp[tmp])
{
mp[tmp] = 1;
Q.push(node(tmp,q.pos - 3,q.step + 1));
}
}
if(q.pos + 1 < s.size())
{
string tmp = q.ss;
swap(tmp[q.pos],tmp[q.pos + 1]);
if(!mp[tmp])
{
mp[tmp] = 1;
Q.push(node(tmp,q.pos + 1,q.step + 1));
}
}
if(q.pos + 2 < s.size())
{
string tmp = q.ss;
swap(tmp[q.pos],tmp[q.pos+2]);
if(!mp[tmp])
{
mp[tmp] = 1;
Q.push(node(tmp,q.pos + 2,q.step + 1));
}
}
if(q.pos + 3 < s.size())
{
string tmp = q.ss;
swap(tmp[q.pos],tmp[q.pos+3]);
if(!mp[tmp])
{
mp[tmp] = 1;
Q.push(node(tmp,q.pos + 3,q.step + 1));
}
}
}
return -1;
}
int main()
{
while(cin >> s >> t)
{
printf("%d\n",bfs());
}
return 0;
}