时间限制: 1Sec 内存限制: 128MB 提交: 55 解决: 28
题目描述
X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。
X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。
如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙。
*WWWBBB
其中,W字母表示白色青蛙,B表示黑色青蛙,*表示空杯子。
X星的青蛙很有些癖好,它们只做3个动作之一:
1. 跳到相邻的空杯子里。
2. 隔着1只其它的青蛙(随便什么颜色)跳到空杯子里。
3. 隔着2只其它的青蛙(随便什么颜色)跳到空杯子里。
对于上图的局面,只要1步,就可跳成下图局面:
WWW*BBB
本题的任务就是已知初始局面,询问至少需要几步,才能跳成另一个目标局面。
输入为2行,2个串,表示初始局面和目标局面。
输出要求为一个整数,表示至少需要多少步的青蛙跳。
输入
输入为2行,2个串,表示初始局面和目标局面。
输出
输出要求为一个整数,表示至少需要多少步的青蛙跳。
样例输入
*WWBB WWBB*
解析:
找最短的步数,自然是bfs,
1只一共六种走法,注意6种走法的条件
用map标记字符串
ac:
#include<bits/stdc++.h>
using namespace std;
map<string,int> mp;
string a,b,c;
struct node
{
string str;
int step;
}cc,dd;
queue<node> que;
void solve()
{
if(mp[c]==0)
{
cc.str=c;
cc.step=dd.step+1;
mp[c]=1;
que.push(cc);
}
}
void bfs()
{
cc.str=a;
cc.step=0;
que.push(cc);
while(!que.empty())
{
dd=que.front();
que.pop();
if(dd.str==b)
{
printf("%d\n",dd.step);
return ;
}
int len=dd.str.length();
for(int i=0;i<len;i++)
{
c=dd.str;
if(c[i]=='*')
continue;
if(c[i+1]=='*'&&i+1<len)
{
swap(c[i],c[i+1]);
solve();
}
else if(c[i-1]=='*'&&i-1>=0)
{
swap(c[i],c[i-1]);
solve();
}
else if(c[i+1]!='*'&&c[i+2]=='*'&&i+2<len)
{
swap(c[i],c[i+2]);
solve();
}
else if(c[i-1]!='*'&&c[i-2]=='*'&&i-2>=0)
{
swap(c[i],c[i-2]);
solve();
}
else if(c[i-1]!='*'&&c[i-2]!='*'&&c[i-3]=='*'&&i-3>=0)
{
swap(c[i],c[i-3]);
solve();
}
else if(c[i+1]!='*'&&c[i+2]!='*'&&c[i+3]=='*'&&i+3<len)
{
swap(c[i],c[i+3]);
solve();
}
}
}
}
int main()
{
cin>>a>>b;
bfs();
return 0;
}