NKOI 1688 移字母游戏

来源:互联网 发布:通过php将base64 编辑:程序博客网 时间:2024/05/17 06:34

移字母游戏

Time Limit:20000MS  Memory Limit:165536K
Total Submit:146 Accepted:94
Case Time Limit:3000MS

Description

移动一个只含大写字母A和B的长度不超过20字符串,给定初始状态和目标状态。
给定移动规则为:只能互相对换相邻字母。请找出一条将字符串由初始状态移动变为目标状态的最少步数的办法。

Input

第一行,一个字符串表示初始状态
第二行,一个字符串表示目标状态

Output

一个整数,表示最少步数

Sample Input

样例输入1AABBAABAAAAB样例输入2:ABBBAABABABA

Sample Output

样例输出14样例输出22


一道双向宽搜的模板题,想了想还是写一下,万一以后能用

这里用的是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();}


0 0
原创粉丝点击