您的位置:首页 > 其它

循环链表—约瑟夫环问题

2016-11-13 15:45 369 查看
  假设n个人决定选出一个领导,将所有人排成一个圆圈,沿着这个圆圈每次数到M个人就排除对应着者,每当有人出列后,其余人靠拢,任然保持一个完整的圆圈,。问题就是找出剩下的那个人是谁,这就是所谓的约瑟夫问题。

算法思想:为了以一种循环方式排列人群,我们构建一个循环链表,每个人与循环左边的人之间构成一个链接,整数i表示循环之中第i个人,生成一个唯一节点的循环链表后(即第一个节点的next指向它自己),在该节点后插入2到N个节点,得到一个从1到N的循环然后跳过M-1个节点,删除第M个节点,依次循环,直到只剩下最后一个节点,就是要寻找的那个数。

                                                                                 

                                                                

                                                                    

#include <stdio.h>
#include <stdlib.h>
struct Node{
int data;
struct Node *next;
};
typedef struct Node link;
int main(){
int m, n, i;
scanf("%d%d", &m, &n);
link *t, *x;
t = (link *)malloc(sizeof(link));
t -> data = 1;
t -> next = t;
x = t;
for(i = 2; i <= m; i++){
x -> next = (link*)malloc(sizeof(link));
x = x -> next;
x -> data = i;
x -> next = t;
}
while(m != 1){
for(i = 1; i < n; i++){
x = x -> next;
}
x -> next = x -> next -> next;
m--;
}
printf("%d", x -> data);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: