小孩转圈淘汰游戏(数组实现)Jose类,Ring类

来源:互联网 发布:魔龙诀进阶数据 编辑:程序博客网 时间:2024/04/28 06:07
#include<iostream>using namespace std;#define TRUE 1#define ERROR 0class Array{private:int *array;int length;public:void Initlist(int n);void Destorylist();void output();int Listlength();int Insert(int s,int n);int Listdelete(int s,int &n,int s1);};void Array::Initlist(int n){int i;length=n;array=new int [n];for(i=0;i<n;i++)array[i]=i+1;}void Array::Destorylist(){delete [] array;}void Array::output(){int i;cout<<"剩余孩子的个数为:"<<length<<endl<<"编号为:";for(i=0;i<length;i++)cout<<array[i]<<" ";}int Array::Listlength(){return length;}int Array::Insert(int s,int n)//当链表中没有数据,则不执行循环{int i;for(i=length;i>=s;i--)array[i]=array[i-1];array[s-1]=n;length++;return TRUE;}int Array::Listdelete(int s,int &n,int s1){if(length==0&&s==0) return ERROR;int i,j;n=array[s-1];j=s-1;for(i=j;i<length;i++)array[i]=array[i+1];length--;j=(j+s1-1)%length+1;return j;}int main(){int Game1(Array a,int m,int k);int Game2(Array a,int m,int k);int m,n,k,k1;cout<<"请输入小孩的个数为:";cin>>n;cout<<"请输入你要淘汰几号编号孩子的间隔数:";cin>>m;cout<<"请输入你想要获胜者的数量:";cin>>k;Array child;child.Initlist(n);child.output();cout<<endl;cout<<"是否中途要增加小孩的数量,不是请输入1,是请输入2:";cin>>k1;if(k1==1)Game1(child,m,k);elseif(k1==2)Game2(child,m,k);elsecout<<"输入有问题!"<<endl;return 0;}int Game1(Array a,int m,int k) //对象的传递是双向的{int t,m1;m1=m;while(a.Listlength()>k) //在这改变获胜者的数量{m=a.Listdelete(m,t,m1);cout<<"淘汰孩子的编号为:"<<t<<endl;a.output();}cout<<"获胜的孩子的编号为:";a.output();cout<<endl;return 0;}int Game2(Array a,int m,int k){int t,s=0,i,m1;int k1;int n=a.Listlength();m1=m;while(a.Listlength()>k) //在这改变获胜者的数量{m=a.Listdelete(m,t,m1);cout<<"淘汰孩子的编号为:"<<t<<endl;a.output();cout<<endl;cout<<"是否要插入小孩,是请输入1,否请输入0:";cin>>k1;if(k1==1){int s1,s2;cout<<"请输入你要插入小孩的个数:";cin>>s1;for(i=0;i<s1;i++){cout<<"请输入你要插入小孩的第"<<i+1<<"个小孩的插入位置:";cin>>s2;a.Insert(s2,++n);cout<<"插入后的小孩排队的序列为:";a.output();cout<<endl;}}elseif(k1==0)continue;else{cout<<"输入错误,跳出程序!"<<endl;break;}}a.output();cout<<endl;return 0;}