洗牌问题(模拟)

题目大意:

已知两堆牌s1和s2的初始状态,
其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去。

现在输入s1和s2的初始状态 以及 预想的最终状态s12

问s1 s2经过多少次洗牌之后,最终能达到状态s12,若永远不可能相同,则输出"-1"。

解题思路:

很浅白的模拟题= = 不懂为什么别人要把它归类到广搜。。。所以我又重新分类了。。。

直接模拟就可以了,关键在于状态记录,然后判重

若s1和s2在洗牌后的状态,是前面洗牌时已经出现过的一个状态,且这个状态不是预想的状态S12,就说明无论怎样再洗牌都不可能达到S12了,因为这个洗牌操作已经陷入了一个“环”

如果状态没有重复过,则一直模拟洗牌,直至s12出现

记录状态可以用map<string,bool>vist

Map的缺省值为0

知道这个就不难了

Sample Input

2
4
AHAH
HAHA
HHAAAAHH
3
CDE
CDE
EEDDCC

Sample Output

1 2
2 -1

//Memory Time
//204K 0MS

#include<iostream>
#include<string>
#include<map>
using namespace std;

int main(int i,int k)
{
int test,c;
int t=0;
cin>>test;
while(++t<=test)
{
cin>>c;
char s1[201]; //牌堆1
char s2[201]; //牌堆2
char s12[401]; //预设最终的牌堆状态
cin>>s1>>s2>>s12;

map<string,bool>vist; //记录出现过的洗牌状态(map缺省值为0)
vist[s12]=true;

int step=0; //洗牌次数
while(true)
{
char s[201]; //当前s1与s2洗牌后的状态
int ps=0; //s[]指针
for(i=0;i<c;i++) //s1与s2洗牌
{
s[ps++]=s2[i];
s[ps++]=s1[i];
}
s[ps]=‘\0‘;

step++;

if(!strcmp(s,s12)) //当洗牌后的状态能达到预设状态时,输出
{
cout<<t<<‘ ‘<<step<<endl;
break;
}
else if(vist[s] && strcmp(s,s12)) //当前洗牌后状态 与 前面出现过的状态重复了,但该状态不是预设状态
{ //说明预设的状态无法达到
cout<<t<<‘ ‘<<-1<<endl;
break;
}

vist[s]=true; //状态记录

for(i=0;i<c;i++) //分拆出s1与s2
s1[i]=s[i];
s1[i]=‘\0‘;

for(k=0;i<2*c;i++,k++)
s2[k]=s[i];
s2[i]=‘\0‘;
}
}
return 0;
}

洗牌问题(模拟)

时间: 2024-09-26 20:20:22

洗牌问题(模拟)的相关文章

模拟斗地主洗牌、发牌(含有排序和不排序的)

不排序的: package cn.idcast5; import java.util.ArrayList; import java.util.Collections; //模拟斗地主洗牌发牌 //分析 //A 创建一个牌盒 //B 装牌 //C 洗牌 //D 发牌 //E 看牌 public class Shiyue31 { public static void main(String[] args) { // 创建一个牌盒 ArrayList<String> array = new Arra

代码实现:模拟斗地主洗牌和发牌并对牌进行排序的代码实现

package com.loaderman.test; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.TreeSet; public class Test{ /** * * A:案例演示 * 模拟斗地主洗牌和发牌并对牌进行排序的代码实现 * * 分析: * 1,买一副扑克,其实就是自己创建一个集合对象,将扑克牌存储进去 * 2,洗牌 * 3,

代码实现:模拟斗地主洗牌和发牌,牌没有排序

package com.loaderman.test; import java.util.ArrayList; import java.util.Collections; public class Test { /** * * A:案例演示 * 模拟斗地主洗牌和发牌,牌没有排序 * * 分析: * 1,买一副扑克,其实就是自己创建一个集合对象,将扑克牌存储进去 * 2,洗牌 * 3,发牌 * 4,看牌 */ public static void main(String[] args) { //1

java 18 - 12 模拟斗地主洗牌、发牌,并对发的牌进行排序

1 /* 2 模拟斗地主的发牌功能(发牌完毕后发到手上的牌是有顺序的) 3 分析: 4 A:创建一个HashMap集合 5 B:创建一个ArrayList集合 6 C:创建两个字符串,一个是花色,一个是牌的数字 (发牌得有一盒牌) 7 为了方便以后的排序,创建这两个字符串的时候,按照大小顺序排列(斗地主中的大小顺序) 8 大小王除外 9 D:把这两个字符串放进HashMap集合中(拼接一起 花色+牌号) 同时给每个放进去牌进行编码0--52并存储 10 同时也给ArrayList集合中存储编码,

hdoj 1210 Eddy&#39;s 洗牌问题 【模拟】

题意:中文题,不翻译.. 策略:观察可知,第i张牌 如果小于等于n 那么他的序号就会变为i*2, 如果大于n 那么就会变成(i-n)*2-1  故 只需要模拟下就好了 AC by SWS 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1210 代码: #include<stdio.h> int main() { int n, cur, pre; while(scanf("%d", &n) == 1){ int ans

G - Shuffle&#39;m Up POJ 3087 模拟洗牌的过程,算作暴力搜索也不为过

G - Shuffle'm Up Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3087 Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by start

ArrayList模拟斗地主的洗牌,发牌和看牌

/* * ArrayList模拟斗地主的洗牌,发牌和看牌 * * 分析: * 1.创建一个牌盒 * 2.装牌 * 3.洗牌 * 4.发牌 * 5.看牌 */ 代码: import java.util.ArrayList; import java.util.Collections; /** * ArrayList模拟斗地主的洗牌,发牌和看牌 * @author TP * */ public class Doudizhu { /* * ArrayList模拟斗地主的洗牌,发牌和看牌 * * 分析:

Map集合、HashMap集合、LinkedHashMap集合、Hashtable集合、Collections工具类和模拟斗地主洗牌和发牌

1.Map集合概述和特点 * A:Map接口概述  * 查看API可以知道:  * 将键映射到值的对象  * 一个映射不能包含重复的键  * 每个键最多只能映射到一个值 * B:Map接口和Collection接口的不同  * Map是双列的,Collection是单列的  * Map的键唯一,Collection的子体系Set是唯一的  * Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效 2.Map集合的功能概述 * A:Map集合的功能概述  *

18.29_集合框架(模拟斗地主洗牌和发牌并对牌进行排序的代码实现)

1 package dou_di_zhu; 2 3 import java.util.ArrayList; 4 import java.util.Collection; 5 import java.util.Collections; 6 import java.util.HashMap; 7 import java.util.TreeSet; 8 9 /** 10 * 思路: 11 * A:创建一个HashMap集合 12 * B:创建一个ArrayList集合 13 * C:创建花色数组和点数