F - Shuffle‘m Up(洗牌)——bfs搜索

Shuffle’m Up

在这里插入图片描述在这里插入图片描述在这里插入图片描述
题意:给定两个长度为n的字符串和一个长度为2n的字符串,长度为n的字符串洗牌形成一个新的字符串。如下:先s1+s2,形成一个新的字符串。然后开始洗牌(交叉组合),然后分成新的s1和s2,再进行洗牌,直到形成新的字符串等于我们给出的长度为2n的字符串。

解题思路:利用bfs搜索寻找最短洗牌时间,这里我们很难利用辅助数组来判断字符串是否访问,所以我们可以利用C++中的STL中的map容器。

AC代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<map>
#include<queue>

using namespace std;

string s1,s2,s;
struct node
{
	int count;
	string s;
};
int n,k;//n表示测试用例,k表示长度
int bfs(node str)
{
	queue<node> Q;
	map<string,int> p;
	Q.push(str);
	node head;
	while(!Q.empty())
	{
		head=Q.front();
		Q.pop();
		node temp;
		if(head.s==s&&head.count!=0)return head.count;
		for(int i=0;i<k;i++)
		{
			temp.s+=head.s[k+i];
			temp.s+=head.s[i];
		}
		if(!p.count(temp.s))  //即只要对应的键值不为0就是被访问过(避免死循环。)
		{
			p[temp.s]=1;
			temp.count=head.count+1;
			Q.push(temp);
		}
	}
	return 0;
}
int main()
{
	while(cin>>n)
	{
		for(int i=1;i<=n;i++)
		{
			cin>>k>>s1>>s2>>s;
			node str;
			str.s=s1+s2;
			str.count=0;
			int result=bfs(str);
			if(result)cout<<i<<" "<<result<<endl;
			else cout<<i<<" "<<"-1"<<endl;
		}
	}
}

posted @   unique_pursuit  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示