约瑟夫环问题
Posted clclcl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了约瑟夫环问题相关的知识,希望对你有一定的参考价值。
题目:设有x个人坐成一个圈,序号为依次为1,2,3......x,选定一个数字n,从1号开始从1报数,每次报到数字n时那个人自杀剩下的人继续从1开始报数,直到所有人都出列,求所有人自杀的顺序。(惊恐万分)
输入:人数x,数字n
输出:a1 a2 a3..... ax
示例输入:
5 2
输出:
2 4 1 5 3
Answer:
1 #include "stdio.h" 2 3 #include "stdlib.h" 4 5 //输入总人数和报的数字,输出所有人的死亡顺序 6 void diesorder(List*plist,int total,int number);//输出顺序 7 void deletenode(Node*plist,int n);//删除链表中某一结点 8 void creat_list(List *plist,int number);//创造链表 9 10 //利用循环链表 11 12 int main(int argc, char const *argv[]) 13 { 14 int total,number; 15 printf("请输入总人数 "); 16 scanf("%d",&total); 17 printf("请输入所报的数 "); 18 scanf("%d",&number); 19 printf("死亡顺序为: "); 20 21 List josef; 22 diesorder(&josef,total,number); 23 24 return 0; 25 } 26 27 void creat_list(List *plist,int number) 28 { 29 30 Node *p=(Node *)malloc(sizeof(Node)); 31 p->value=number; 32 p->next=NULL; 33 34 Node *last=plist->head; 35 if(last) 36 { 37 while(last->next) 38 last=last->next;//链接 39 last->next=p; 40 } 41 else 42 plist->head=p; 43 } 44 45 void diesorder(List*plist,int total,int number){ 46 for (int i=1; i<=total; i++) { 47 creat_list(plist, i); 48 } 49 50 Node*p; 51 p=plist->head; 52 for (;p->next; p=p->next) { 53 ; 54 }//遍历到最后一个节点 55 p->next=plist->head; //改造为循环链表 56 57 Node*p2=plist->head; 58 for (int i=1; ;i++,p2=p2->next) { 59 if (i==number) { 60 i=0;printf("%i ",p2->value);deletenode(p2,total);total--; 61 } 62 if (total==0) { 63 break; 64 } 65 } 66 } 67 68 void deletenode(Node*plist,int n){ 69 Node*pre=plist; 70 for (int i=1;i<n; i++) { 71 pre=pre->next; 72 } 73 pre->next=plist->next; 74 Node*pp=plist; 75 plist=pre->next; 76 free(pp); 77 pp=NULL; 78 79 }
以上是关于约瑟夫环问题的主要内容,如果未能解决你的问题,请参考以下文章