约瑟夫问题的实现(0956)

题目描述

n个人围成一个圈,每个人分别标注为1、2、...、n,要求从1号从1开始报数,报到k的人出圈,接着下一个人又从1开始报数,如此循环,直到只剩最后 一个人时,该人即为胜利者。例如当n=10,k=4时,依次出列的人分别为4、8、2、7、3、10,9、1、6、5,则5号位置的人为胜利者。给定n个 人,请你编程计算出最后胜利者标号数。(要求用单循环链表完成。)

input

第一行为人数n;
第二行为报数k

output

输出最后胜利者的标号数。

样例输入

10
4
样例输出
5
 
这道题的思路是构建一个环形链表,然后用一个指针在环形链表上移动,找出最后的胜利者。
代码如下
 1 #include<iostream>
 2 #include<stdlib.h>
 3 using std::cin;
 4 using std::cout;
 5 using std::endl;
 6  
 7 int n;
 8 struct node{
 9     int num;
10     node*next;
11 }; 
12  
13 node*create(node*head){
14     int a=1;
15     head=(node*)malloc(sizeof(node));
16     node*p=NULL,*q=NULL;
17     p=head;
18     p->num=1;
19     p->next=head;
20     int i;
21     for(i=1;i<n;i++){
22         q=(node*)malloc(sizeof(node));
23         p->next=q;
24         q->num=i+1;
25         q->next=head;
26         p=q;
27     }
28     return head;
29 }
30 node*del(node*p,int m){
31     int i;
32     for(i=2;i<m;i++){
33         p=p->next;
34     }
35     node*temp=NULL;
36     temp=p->next;
37     p->next=temp->next;
38     free(temp);
39     return p;
40 }
41 int main(){
42     node*p=NULL;
43     cin>>n;
44     p=create(p);
45     int m;
46     cin>>m;
47     int t=n;
48     for(int i=1;i<n;i++){
49         p=del(p,m);
50         p=p->next;
51     }
52     cout<<p->num;
53     return 0;
54 }
原文地址:https://www.cnblogs.com/swust-wangyf/p/6725156.html