蓝桥杯 算法提高 vip试题 洗牌

试题 算法提高 洗牌

资源限制 

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

  小弱T在闲暇的时候会和室友打扑克,输的人就要负责洗牌。虽然小弱T不怎么会洗牌,但是他却总是输。
  渐渐地小弱T发现了一个规律:只要自己洗牌,自己就一定会输。所以小弱T认为自己洗牌不够均匀,就独创了一种小弱洗牌法。
  小弱洗牌法是这样做的:先用传统洗牌法将52张扑克牌(1到K各四张,除去大小王)打乱,放成一堆,然后每次从牌堆顶层拿一张牌。如果这张牌的大小是P(1到K的大小分别为1到13),那么就把这张牌插入到当前手中第P张牌的后面。如果当前手中不足P张牌,那么就把这张牌放在最后。
  现在给你一对已经被打乱的牌,请你用小弱洗牌法进行洗牌,然后输出最后生成的序列。
  注意:小弱可能在第一次洗牌时弄丢了某些牌,这时请你输出一个-1来提醒他牌的数目不够。

输入格式

  测试数据的输入含N个用空格隔开的字符串表示牌堆从顶至底的每张扑克(1到K中的某个)。可能有多行。

输出格式

  如果N为52,输出用小弱洗牌法洗牌后的序列,每个字符串用空格隔开。
  否则请输出一个-1.

样例输入

4 6 K Q 5 1 Q 9 7 9 K 3 J 1 2 3 5
2
3 5 7 Q 7 10 8 4 9 7 8 9 4
10 6 2 8 2 10 10 Q 5 K J 1
J 8 3 K 4 1 6 J 6

样例输出

4 1 1 1 3 4 6 6 2 2 2 5 J 3 8 4 4 6 K J 8 J 10 10 K Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K

数据规模和约定

  保证每个字符串都为1 2 3 4 5 6 7 8 9 10 J Q K中的一个。

这道题主要存在2个问题,一是该如何输入并知晓牌的数量,二是洗牌规则是什么?

首先对问题一,我们可以进行如下操作:

    string s;//定义一个字符串s,用string时要使用头文件#include <string>
	int poke1[60]={0},poke2[60]={0},i=0,len=0;//再定义数组poke1,用于存放牌的大小,i记录输入的牌的数量,数组poke2作为存放牌堆,len记录poke2中存放牌的数量
	while(cin>>s)//利用while(cin>>s),可多次输入数据,此处无具体循环次数,需要用户在输入完最后一个数据时按换行符,再同时按Ctrl+z,最后按一次换行即可退出循环
	{
		if(s.size()>=2)//如果s的长度大于1,则此时用户输入了1和0,即10,此时存入poke1中
		{
			poke1[i++]=10;
		}
		else//如果长度为1,则判断首位元素,再化为合理的牌的大小
		{
			if(s[0]<='9' && s[0]>='0')
			{
				poke1[i++]=s[0]-'0';
			}
			else if(s[0]=='J')
			{
				poke1[i++]=11;
			}
			else if(s[0]=='Q')
			{
				poke1[i++]=12;
			}
			else if(s[0]=='K')
			{
				poke1[i++]=13;
			}
		}
	}

对于问题二:

洗牌规则是什么?题目真实意思为,你从刚洗好的牌堆中,由上至下放入牌堆2中,每放入一张进行一次洗牌规则,即每次从牌堆顶层拿一张牌。如果这张牌的大小是P(1到K的大小分别为1到13),那么就把这张牌插入到当前手中第P张牌的后面

例如:

牌堆一

4 6 K Q 5 1 Q 9 7 9 K 3 J 1 2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6

牌堆二

此时没有牌

第一步

牌堆一

6 K Q 5 1 Q 9 7 9 K 3 J 1 2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6

牌堆二

4

(说明,首先从牌堆一中的顶部拿一张牌为4,再放入牌堆二中,此时由于牌堆2的牌数量小于4,所以放在最后一张)

第二步

牌堆一

K Q 5 1 Q 9 7 9 K 3 J 1 2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6

牌堆二

4 6

(说明,从牌堆一中的顶部拿一张牌为6,再放入牌堆二中,此时由于牌堆2的牌数量小于6,所以放在最后一张)

此后每次洗牌如下

牌堆一:K Q 5 1 Q 9 7 9 K 3 J 1 2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 6 K


牌堆一:Q 5 1 Q 9 7 9 K 3 J 1 2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 6 K Q


牌堆一:5 1 Q 9 7 9 K 3 J 1 2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 6 K Q 5


牌堆一:1 Q 9 7 9 K 3 J 1 2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 6 K Q 5


牌堆一:Q 9 7 9 K 3 J 1 2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 6 K Q 5 Q


牌堆一:9 7 9 K 3 J 1 2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 6 K Q 5 Q 9


牌堆一:7 9 K 3 J 1 2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 6 K Q 5 Q 7 9


牌堆一:9 K 3 J 1 2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 6 K Q 5 Q 7 9 9


牌堆一:K 3 J 1 2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 6 K Q 5 Q 7 9 9 K


牌堆一:3 J 1 2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 6 3 K Q 5 Q 7 9 9 K


牌堆一:J 1 2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 6 3 K Q 5 Q 7 9 9 J K


牌堆一:1 2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 1 6 3 K Q 5 Q 7 9 9 J K


牌堆一:2 3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 1 6 3 K Q 5 Q 7 9 9 J K


牌堆一:3 5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 1 6 3 K Q 5 Q 7 9 9 J K


牌堆一:5 2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 1 5 6 3 K Q 5 Q 7 9 9 J K


牌堆一:2 3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 2 3 1 5 6 3 K Q 5 Q 7 9 9 J K


牌堆一:3 5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 2 3 1 5 6 3 K Q 5 Q 7 9 9 J K


牌堆一:5 7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 2 5 3 1 5 6 3 K Q 5 Q 7 9 9 J K


牌堆一:7 Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 2 5 3 7 1 5 6 3 K Q 5 Q 7 9 9 J K


牌堆一:Q 7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 2 5 3 7 1 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:7 10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 2 5 3 7 7 1 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:10 8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 2 5 3 7 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:8 4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 2 5 3 7 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:4 9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 4 2 5 3 7 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:9 7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 4 2 5 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:7 8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 4 2 5 7 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:8 9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 4 2 5 7 8 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:9 4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 4 2 5 7 8 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:4 10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 4 4 2 5 7 8 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:10 6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 4 4 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:6 2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 3 4 4 6 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:2 8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 2 3 4 4 6 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:8 2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 2 3 4 4 6 8 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:2 10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 2 2 3 4 4 6 8 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:10 10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 2 2 3 4 4 6 8 10 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:10 Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 2 2 3 4 4 6 8 10 10 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:Q 5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 2 2 3 4 4 6 8 10 10 Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:5 K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 2 2 5 3 4 4 6 8 10 10 Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:K J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 2 2 5 3 4 4 6 8 10 10 K Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:J 1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 2 2 2 5 3 4 4 6 8 J 10 10 K Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:1 J 8 3 K 4 1 6 J 6
牌堆二:4 1 1 2 2 2 5 3 4 4 6 8 J 10 10 K Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:J 8 3 K 4 1 6 J 6
牌堆二:4 1 1 2 2 2 5 3 4 4 6 J 8 J 10 10 K Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:8 3 K 4 1 6 J 6
牌堆二:4 1 1 2 2 2 5 3 8 4 4 6 J 8 J 10 10 K Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:3 K 4 1 6 J 6
牌堆二:4 1 1 3 2 2 2 5 3 8 4 4 6 J 8 J 10 10 K Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:K 4 1 6 J 6
牌堆二:4 1 1 3 2 2 2 5 3 8 4 4 6 K J 8 J 10 10 K Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:4 1 6 J 6
牌堆二:4 1 1 3 4 2 2 2 5 3 8 4 4 6 K J 8 J 10 10 K Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:1 6 J 6
牌堆二:4 1 1 1 3 4 2 2 2 5 3 8 4 4 6 K J 8 J 10 10 K Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:6 J 6
牌堆二:4 1 1 1 3 4 6 2 2 2 5 3 8 4 4 6 K J 8 J 10 10 K Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:J 6
牌堆二:4 1 1 1 3 4 6 2 2 2 5 J 3 8 4 4 6 K J 8 J 10 10 K Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K


牌堆一:6
牌堆二:4 1 1 1 3 4 6 6 2 2 2 5 J 3 8 4 4 6 K J 8 J 10 10 K Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K

问题二代码如下

    if(i<52)//如果i<52,则牌的数量小于52,输出1
	{
		cout<<-1;
	}
	else
	{
		for(int j=0;j<52;j++)
		{
			int p=poke1[j];//用p记录poke1牌顶的大小
			if(len<p)//如果牌的大小小于poke2中牌的数量,则将牌放在最后一张
			{
				poke2[len]=p;
			}
			else
			{
				int subscripe;//定义subscripe用于记录poke2中牌的下标
				for(subscripe=len+1;subscripe>p;subscripe--)//poke2中牌从最后一张依次向后移,留出存放牌p的位置
				{
					poke2[subscripe]=poke2[subscripe-1];
				}
				poke2[subscripe]=p;//将p存放到第p张牌后
			}
			len++;//poke2长度加一
		}
		for(int j=0;j<52;j++)//最终输出牌的顺序
		{
			if(poke2[j]==11)
				cout<<"J";
			else if(poke2[j]==12)
				cout<<"Q";
			else if(poke2[j]==13)
				cout<<"K";
			else
				cout<<poke2[j];
			cout<<" ";
		}
	}

整体代码如下

#include <iostream>
#include <string>
using namespace std;
int main()
{	
	string s;//定义一个字符串s,用string时要使用头文件#include <string>
	int poke1[60]={0},poke2[60]={0},i=0,len=0;//再定义数组poke1,用于存放牌的大小,i记录输入的牌的数量,数组poke2作为存放牌堆,len记录poke2中存放牌的数量
	while(cin>>s)//利用while(cin>>s),可多次输入数据,此处无具体循环次数,需要用户在输入完最后一个数据时按换行符,再同时按Ctrl+z,最后按一次换行即可退出循环
	{
		if(s.size()>=2)//如果s的长度大于1,则此时用户输入了1和0,即10,此时存入poke1中
		{
			poke1[i++]=10;
		}
		else//如果长度为1,则判断首位元素,再化为合理的牌的大小
		{
			if(s[0]<='9' && s[0]>='0')
			{
				poke1[i++]=s[0]-'0';
			}
			else if(s[0]=='J')
			{
				poke1[i++]=11;
			}
			else if(s[0]=='Q')
			{
				poke1[i++]=12;
			}
			else if(s[0]=='K')
			{
				poke1[i++]=13;
			}
		}
	}
	if(i<52)//如果i<52,则牌的数量小于52,输出1
	{
		cout<<-1;
	}
	else
	{
		for(int j=0;j<52;j++)
		{
			int p=poke1[j];//用p记录poke1牌顶的大小
			if(len<p)//如果牌的大小小于poke2中牌的数量,则将牌放在最后一张
			{
				poke2[len]=p;
			}
			else
			{
				int subscripe;//定义subscripe用于记录poke2中牌的下标
				for(subscripe=len+1;subscripe>p;subscripe--)//poke2中牌从最后一张依次向后移,留出存放牌p的位置
				{
					poke2[subscripe]=poke2[subscripe-1];
				}
				poke2[subscripe]=p;//将p存放到第p张牌后
			}
			len++;//poke2长度加一
		}
		for(int j=0;j<52;j++)//最终输出牌的顺序
		{
			if(poke2[j]==11)
				cout<<"J";
			else if(poke2[j]==12)
				cout<<"Q";
			else if(poke2[j]==13)
				cout<<"K";
			else
				cout<<poke2[j];
			cout<<" ";
		}
	}
	return 0;
}

本人第一次发布文章,可能做的不好,请各位体谅,谢谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值