保加利亚单人纸牌游戏

临近期末了,做一道和考试毫不相关的题冲冲喜

题目:
取出45张牌,然后把他们随机分成若干堆。接下来,从每一堆取出一张牌,叠在一起形成一堆新的牌。不断地这样做下去,如果某个时候桌面上正好有9张牌分别为1,2,3,4,5,6,7,8,9.你就获胜了。

样例说明
堆数:5
每一堆的牌数:3 ,12 ,15,7,8
最终结果:1,2,3,4,5,6,7,8,9

其中堆数和牌数均随机产生。

算法链接
https://www.baidu.com/link?url=CUuTDW8T3Jox6GfsGrA5EzrVxiHD4PTi7hmMXleCRVDxtghvcQN0MOBUIpNWLOafbAHyu6DT8Hdi5Ifdxz6xawQazB5-7rCZyFCQQov9VWW&wd=&eqid=8966376c00947f780000000360ce9a2d

我写的菜菜代码:

// 保加利亚纸牌游戏
//一,输入一个三角形数,n=1+2+3+4...+k;
//二,生成任意堆数的纸牌
//三,从底层抽取所有数,产生新堆
        //堆上牌数为0时,删除该堆
//四 ,符合按顺序时,交换位置输出
#include <iostream>
#include<cstdlib>
#include<ctime>
#include<vector>
#include<algorithm>
using namespace std;
bool is_trangle(int n);//判断是否为三角形数
bool IS_TRUE(vector<int>a);//判断向量是否满足1~k均包含
void _delete(vector<int>&a);//删除元素为零的位置
     						//引用参数来修改向量本身
int main()
{
    //一,输入并判断一个三角形数
   int n;
   cin>>n;
   if(!is_trangle(n))
   {
       return 0;
   }
   //二,生成任意堆数的纸牌
   srand(time(0));
   int dui=rand()%n+1;//堆数
   cout<<"The prime dui is :"<<endl;
   cout<<dui<<endl;
   
   vector<int>vec;
   for(int i=0;i<dui-1;i++)
   {
       int t=rand()%(n-dui+i+1)+1;//rand()%1编译器会崩
       vec.push_back(t);//牌数
       n-=t;
   }
   vec.push_back(n);
   cout<<"The order is:"<<endl;
   for(int i=0;i<dui;i++)
   {
       cout<<vec[i]<<" ";
   }
   //三,更改牌堆
   bool is_true;
   while(!is_true)
    {
        is_true=false;
        int dsize=vec.size();
        bool flag=false;
        for(int i=0;i<dsize;i++)
        {
            vec[i]-=1;
            if(vec[i]==0)
            {
                flag=true;
            }
        }
        if(flag)
        {
            _delete(vec);
        }
        vec.push_back(dsize);
        is_true=IS_TRUE(vec);
    }
    //四,对输出处理
    cout<<endl<<"The new order is:"<<endl;
    sort(vec.begin(),vec.end());
    int lsize=vec.size();
    for(int i=0;i<lsize;i++)
   {
       cout<<vec[i]<<" ";
   }
    return 0;
}

void _delete(vector<int>&a)
{
    int len=a.size();
    for(int i=0;i<len;i++)
    {
        while(a[i]==0)//可能存在更新后i位置还为零的情况
        {
            for(int j=i;j<len;j++)
            {
                if(j==len-1)
                {
                    a.pop_back();
                    len=a.size();
                    break;
                }
                a[j]=a[j+1];
            }
            if(i==len)//末尾为零的情况
            {
                break;
            }
        }
    }
}
bool IS_TRUE(vector<int>a)
{
    int len=a.size();
    for(int i=1;i<=len;i++)
    {
        int count=0;
        for(int j=0;j<len;j++)
        {
            if(i==a[j])
            {
                count++;
            }
        }
        if(count!=1)
        {
            return false;
        }
    }
    return true;
}
bool is_trangle(int n)
{
   int t=0;
   for(int i=1;i<n;i++)
   {
       t=t+i;
       if(n==t)
       {
           return true;
       }
       if(n<t)
       {
           cout<<"please input again!"<<endl;
           return false;
       }
   }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值