7.洗牌(简单搜索 BFS)
1.1.棋盘问题(简单搜索 DFS)2.2.地牢大师(简单搜索 三维BFS)3.3.抓住那头牛(简单搜索 一维BFS)4.4.翻转(简单搜索 枚举)5.5.找倍数(简单搜索 BFS)6.6.质数路径(简单搜索 BFS)
7.7.洗牌(简单搜索 BFS)
8.8.罐子(简单搜索 BFS最短步数+记录方案)9.9.点火游戏(简单搜索 BFS)10.10.起火迷宫(简单搜索 多源BFS)11.11.迷宫问题(简单搜索 BFS 储存路径)12.12.石油储备(简单搜索 DFS/BFS 统计连通块个数)13.13.非常可乐(简单搜索 BFS)14.14.找路(简单搜索 BFS 最短步数)15.1.八数码 (搜索进阶 BFS)16.2.八数码II(搜索进阶 IDA*估价函数 + 迭代加深)洗牌
↑ 题目链接
题目
给定两叠纸牌
每张牌的尺寸大小都完全相同,但是颜色可能不同。
下面介绍洗牌规则。
不妨设
洗牌就是将这两叠牌交错堆叠在一起,形成一个拥有
新牌堆中的牌由上至下依次为
然后,将牌堆从中间一分为二,下半部分是新的
这样就可以继续进行洗牌操作获得新的
给定
输入格式
第一行包含一个整数
每组数据第一行包含一个整数
第二行包含一个长度为
第三行包含一个长度为
第四行包含一个长度为
输出格式
共
然后输出所需要的最少洗牌次数。如果无法通过洗牌获得目标牌堆,则输出 −1。
数据范围
卡牌最多有
输入样例:
2
4
AHAH
HAHA
HHAAAAHH
3
CDE
CDE
EEDDCC
输出样例:
1 2
2 -1
思路
按照题意,通过
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n;
int bfs(string a,string b,string c)
{
queue<string>q;
map<string,int>d;
string tem;
for(int i=0;i<n;i++)//第一次洗牌
{
tem+=b[i];
tem+=a[i];
}
q.push(tem);
d[tem]=1;
while(q.size())
{
auto t=q.front();
q.pop();
if(t==c)return d[c];//搜到合法方案
string tem2;
for(int i=0;i<n;i++)//重新洗牌
{
tem2+=t[i+n];
tem2+=t[i];
}
if(d.count(tem2))return -1;//产生循环,无解
d[tem2]=d[t]+1;
q.push(tem2);
}
return -1;
}
int main()
{
int T;
cin>>T;
for(int i=1;i<=T;i++)
{
string a,b,c;
cin>>n>>a>>b>>c;
printf("%d %d\n",i,bfs(a,b,c));
}
return 0;
}
本文来自博客园,作者:风雨zzm,转载请注明原文链接:https://www.cnblogs.com/zzmxj/p/17367375.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)