临近期末了,做一道和考试毫不相关的题冲冲喜
题目:
取出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;
}
}
}