击鼓传花



题目:



分析:

这个问题在知道它的规则之后,就可以用循环链表来模拟这个游戏的过程,具体如下:

  1. N个人编号后按顺序围成圈,就相当于是建一个链表,节点存储编号,最后一个节点要指向第一个节点,形成一个环。
  2. 传花的过程就相当于指针移动的过程。
  3. 出局就相当于删除链表的节点。

最后,只要输出剩下的节点所存储的编号就好了。由于这个游戏中,一号其实是没有存在意义的,因为他在开始前就已经出局了,所以可以不考虑。也就是说可以少加一个节点,少一次删除的操作。



代码:

#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;  
}  


原文地址:https://www.cnblogs.com/jiuweilinghu/p/5935845.html