NKOI 1688 移字母游戏

本文介绍了一个简单的字符串移动问题——移字母游戏,通过双向宽度优先搜索(BFS)算法解决从初始状态到目标状态的问题。该算法利用map来记录已访问的状态,并通过两个队列分别从起始和结束状态进行搜索,以找到转换所需的最小步骤。

移字母游戏

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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值