发现我快把类的封装性给丢了
题目:n 个人围成一圈, 并依次编号1~n,。从编号为1 的人开始,按顺时针方向每隔一人选出一个,
剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿。如果你想成为最后两个
幸运儿,请问开始时应该站在什么位置?(设3<=n<=50)
大家有兴趣可以做做
因为要记录人的幸运位置 我觉得用节点记录位置简单些,用数组应该也行,但是我不知道如何处理数组中让元素踢出数组. 似乎这样做很麻烦,每次T出一个数都要响应的改变数组的大小.
在用类的时候竟然都把定义给忘了.
下面是我刚开始的思路
struct Tnode
{
int pos;//位置
Tnode *next;
}Tnode *head;
Tnode *p=head;
int count;//人的个数
...
while(count!=2)//最后留下的2个人
{
if(*p->next->next==NULL) //判断从下一个循环是踢第一个人,还是跳一个人,踢下一个
*p=head; //设置下循环踢人的位置
else
*p=head->next;
for( ;*p->next!=NULL||*p->next->next!=NULL;*p=*p->next->next)
{
DelNode(p); //删除当前节点
count--; //人数减1
}
}
count>>head.pos>>head->next.pos;//输出
虽然用了链,但是思想却还是数组的. 从数组的思想来看,这道题的难点就是要判断T人到最后的时候要判断是否是最后一个,这样非常麻烦,特别是当调的人数很大的时候.
其实用了瑟夫环的话就没必要这么考虑,只需要考虑跳人的多少 .....
呵呵 我把它类封了~~
唉~ 叹息自己还没学到家,刚开始的时候的错误让我想吐血.
下面是我写的实现代码
struct CJ_Tnode
{
int data;
Tnode *next;
};//节点定义
class CJ_TPclass
{
public:
CJ_TPclass(int ms,int mb,int mm);
void Creat();
//int OutNode(Tnode *p);
void Print();
~CJ_TPclass()
{
Tnode *temp;
for(temp=flag;temp->next!=NULL;temp=temp->next)
delete(temp);
}
protected:
CJ_Tnode *head,*tail,*flag;
int sump,beginp,m;
};
CJ_TPclass::CJ_TPclass(int ms,int mb,int mm)//初始化
{
head=NULL;
tail=NULL;
sump=ms;
beginp=mb;
m=mm;
flag=NULL;
}
void CJ_TPclass::Creat()//建立循环表
{
Tnode *temp=NULL;
int number=1;
head=new Tnode;
tail=new Tnode;
head->data=1;
head->next=tail;
tail->data=sump;
tail->next=head;//建立头和尾
while(number!=(sump-1))//中间插的人的数量 按一定的位置顺序
{
temp=new Tnode;
temp->data=sump-number;
temp->next=head->next;
cout<<temp->data<<endl;
head->next=temp;
number++;
}
}
void CJ_TPclass::Print()
{
Tnode *temp=head,*p=NULL;//temp:开始的变量
while(temp->data!=beginp)
temp=temp->next;
while(sump!=2)//留两个 可以设置变量 让用户选择
{
for(int i=1;i<=m;i++)//选人
temp=temp->next;
p=temp->next;//p=temp
temp->next=p->next;
cout<<p->data<<endl;
delete(p);
sump--;
}
flag=temp;
for(int i=1;i<=2;i++)
{
cout<<"the last"<<temp->data;//因为留了两个
temp=temp->next;
}
}