首页 > 其他分享 >7.洗牌(简单搜索 BFS)

7.洗牌(简单搜索 BFS)

时间:2023-05-02 09:56:20浏览次数:56  
标签:大写字母 12 string int 洗牌 张牌 BFS 搜索

洗牌

↑ 题目链接

题目

给定两叠纸牌 \(S1\) 和 \(S2\),每叠恰好有 \(C\) 张牌。

每张牌的尺寸大小都完全相同,但是颜色可能不同。

下面介绍洗牌规则。

不妨设 \(S1\) 中纸牌从上到下编号依次为 \(a_1,a_2,…,a_C\) ,\(S_2\) 中纸牌从上到下编号依次为 \(b_1,b_2,…,b_C\) 。

洗牌就是将这两叠牌交错堆叠在一起,形成一个拥有 \(2C\) 张牌的新牌堆 \(S_{12}\) 。

新牌堆中的牌由上至下依次为 \(a_1,b_1,a_2,b_2,…,a_C,b_C\) 。

然后,将牌堆从中间一分为二,下半部分是新的 \(S_1\),上半部分是新的 \(S2\) 。

这样就可以继续进行洗牌操作获得新的 \(S_{12}\) 了。

给定 \(S_1\) 和 \(S_2\) ,请问至少需要进行多少轮洗牌操作方可获得指定牌堆 \(S_{12}\)。

输入格式

第一行包含一个整数 \(T\) ,表示共有 \(T\) 组测试数据。

每组数据第一行包含一个整数 \(C\)。

第二行包含一个长度为 \(C\) 的由大写字母构成的字符串,其中第 \(i\) 个字母表示初始 \(S_1\) 中由底向上第 \(i\) 张牌的颜色。

第三行包含一个长度为 \(C\) 的由大写字母构成的字符串,其中第 \(i\) 个字母表示初始 \(S2\) 中由底向上第 \(i\) 张牌的颜色。

第四行包含一个长度为 \(2C\) 的由大写字母构成的字符串,其中第 \(i\) 个字母表示目标 \(S_{12}\) 中由底向上第 \(i\) 张牌的颜色。

输出格式

共 \(T\) 行,每行输出一组数据的结果,首先输出组别编号 \(i\)(从1开始),

然后输出所需要的最少洗牌次数。如果无法通过洗牌获得目标牌堆,则输出 −1。

数据范围

\(1≤T≤1000,1≤C≤100\)
卡牌最多有 \(8\) 种颜色,用大写字母 \(A∼H\) 表示,所以输入字符串中不会出现其他大写字母。

输入样例:

2
4
AHAH
HAHA
HHAAAAHH
3
CDE
CDE
EEDDCC

输出样例:

1 2
2 -1

思路

按照题意,通过 \(BFS\) 搜索情况,,最多枚举 \(2C\) 次,就可以知道能否得到该字符串

代码

#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;
}

标签:大写字母,12,string,int,洗牌,张牌,BFS,搜索
From: https://www.cnblogs.com/zzmxj/p/17367375.html

相关文章

  • 3.抓住那头牛(简单搜索 BFS)
    抓住那头牛↑题目链接题目农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点\(N\),牛位于点\(K\)。农夫有两种移动方式:从\(X\)移动到\(X−1\)或\(X+1\),每次移动花费一分钟从\(X\)移动到\(2∗X\),每次移动花费一分钟假设牛没有意识到农夫的行动,站......
  • 2.地牢大师(简单搜索 BFS)
    地牢大师↑题目链接题目你现在被困在一个三维地牢中,需要找到最快脱离的出路!地牢由若干个单位立方体组成,其中部分不含岩石障碍可以直接通过,部分包含岩石障碍无法通过。向北,向南,向东,向西,向上或向下移动一个单元距离均需要一分钟。你不能沿对角线移动,迷宫边界都是坚硬的岩石,你......
  • 1.棋盘问题(简单搜索)
    棋盘问题↑题目链接题目在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放\(k\)个棋子的所有可行的摆放方案数目\(C\)输入格式输入含有多组测试数据。......
  • pyqt5-文本框搜索功能
    1、介绍作用是对一个文本框组件的文本进行搜索,将搜索结果在文本框中进行字体颜色标记,允许re或者普通文本搜索,支持上一个或下一个的跳转,支持标签显示当前索引和总个数。2、ui3、代码(1)自定义search.py,其中包含两个重要的函数"""搜索算法返回结果是list,元素是二元list,表示......
  • 堆与二叉搜索树学习笔记
    部分内容来自OI-WIKI。1.堆堆的定义堆是一棵二叉树,满足每个节点的键值都大于等于它的父亲节点或者小于等于它的父亲节点。每个节点的键值都大于等于它的父亲节点的叫小根堆,每个节点的键值都小于等于它的父亲节点的叫大根堆。优先队列是一种抽象数据类型,它是一种容器,里面有......
  • BFS 简单应用
    前言:BFS即广度优先搜索(或宽度优先搜索),具体定义和实现不在赘述。本文所有代码前的开头头文件,宏定义和命名空间如下(只是一些常用的define和一个快读):#include<bits/stdc++.h>#defineTptemplate<typenameTy>#defineTstemplate<typenameTy,typename...Ar>#definell......
  • 搜索引擎如何判断锚文本质量
    搜索引擎判断锚文本是否适合,主要通过如下几点判断:(1)锚文本植入符合文章需求,该出现的时候出现,不该出现的时候不要出现。(2)对所在文章有促进作用,用户阅读的时候可以通过锚文本扩展阅读。(3)能延展用户需求,挖掘用户额外需求并满足。(4)锚文本设置的数量和位置都做到依据文章的延展需求而定......
  • java 类似于google搜索提示的功能,文本框输入提示
    需要先导入数据库,并且在SearchSuggest中改数据库连接参数黑色头发:http://heisetoufa.iteye.com/......
  • lazada按关键字搜索商品API接口
    ​lazada按关键字搜索商品API接口,在lazada上搜索产品,如果只需要搜索单个产品的话,那么直接在搜索框输入“关键字”即可,如果需要多个产品,那么则需要进行关键字扩展。lazada按关键字搜索商品API接口分为两部分:1.查询列表部分:在列表部分输入“关键字”,即可查询到对应的商品列表;2......
  • 为Flowportal 流程库 增加 按流程关键字 全局搜索功能
    用户在Flowportal后台流程库中维护已建好的流程时,如果已建立的流程比较多且分布在多个文件夹下时,由于系统提供的流程查找功能,仅局限于在某个文件夹中按流程关键字过滤,导致查找流程效率底,速度慢,鉴于此,本人特别根据广大用户的实际需求,改进流程库的查找功能,使用户可以根据流程关键......