移字母游戏
Time Limit:20000MS Memory Limit:165536K
Total Submit:146 Accepted:94
Case Time Limit:3000MS
Description
移动一个只含大写字母A和B的长度不超过20字符串,给定初始状态和目标状态。
给定移动规则为:只能互相对换相邻字母。请找出一条将字符串由初始状态移动变为目标状态的最少步数的办法。
Input
第一行,一个字符串表示初始状态
第二行,一个字符串表示目标状态
Output
一个整数,表示最少步数
Sample Input
样例输入1
AABBAA
BAAAAB
样例输入2:
ABBBAA
BABABA
Sample Output
样例输出1
4
样例输出2
2
一道双向宽搜的模板题,想了想还是写一下,万一以后能用
这里用的是map,不过对于比较复杂的数据结构上尽量不要用map,漏洞百出
#include<cstdio>
#include<iostream>
#include<map>
#include<queue>
using namespace std;
string s1,s2;
map<string,int>vis;
map<string,int>step;
queue<string>q[2];
int len;
int bfs(){
q[0].push(s1);vis[s1]=1;step[s1]=0;
q[1].push(s2);vis[s2]=2;step[s2]=0;
while(q[0].size()&&q[1].size()){
int t,i;
string x,y;
t= q[0].size()>=q[1].size();
x=q[t].front();q[t].pop();
y=x;
for(i=1;i<len;i++)
if(x[i]!=x[i-1]){
swap(y[i],y[i-1]);
if(vis[x]&&vis[y]&&vis[x]!=vis[y])return step[x]+step[y]+1;
if(!vis[y]){
vis[y]=vis[x];
step[y]=step[x]+1;
q[t].push(y);
}
y=x;
}
}
}
int main(){
cin>>s1>>s2;
len=s1.length();
cout<<bfs();
}