题目:
分析:
这个问题在知道它的规则之后,就可以用循环链表来模拟这个游戏的过程,具体如下:
- N个人编号后按顺序围成圈,就相当于是建一个链表,节点存储编号,最后一个节点要指向第一个节点,形成一个环。
- 传花的过程就相当于指针移动的过程。
- 出局就相当于删除链表的节点。
最后,只要输出剩下的节点所存储的编号就好了。由于这个游戏中,一号其实是没有存在意义的,因为他在开始前就已经出局了,所以可以不考虑。也就是说可以少加一个节点,少一次删除的操作。
代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
struct Node
{
int num;
Node *next;
};
int main()
{
Node *head,*p,*newp,*p1;
int i,j,n,m;
cin>>n>>m;
head=(Node*)malloc(sizeof(Node));
p=head;
for(i=1;i<n;i++)
{
newp=(Node*)malloc(sizeof(Node));
newp->num=i+1;
p->next=newp;
p=p->next;
}
p->next=head->next;
p=head;
for(j=0;j<n-2;j++)
{
for(i=0;i<m-1;i++)
p=p->next;
p1=p->next;
p->next=p1->next;
delete p1;
}
cout<<p->num<<endl;
return 0;
}