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;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!