约瑟夫生者死者游戏:30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉大家,只有将全船一半的旅客投入海中,其余人才能幸免遇难。无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人开始,依次报数,数到第9个人,就把他投入大海中,然后从他的下一个人开始从1数起,数到第9个人,再将她投入大海,如此循环,直到剩下15个人乘客为止。问哪些位置是将被扔到大海的位置。
解法有许多种,可以用数组,应为涉及到删除操作,数组(顺序线性表)比较麻烦,但不必要删除,只需要给跳船的人(元素),赋一个值来区分就好了。
当然也可以用循环链表来做,如下;
1 #include<stdio.h> 2 #include<stdlib.h> 3 struct DuLNOde{ 4 5 int date; 6 struct DuLNOde * next; 7 }; 8 int main() 9 { 10 struct DuLNOde *q=NULL; 11 struct DuLNOde *p=NULL; 12 struct DuLNOde *z=NULL; 13 q=(struct DuLNOde*)malloc(sizeof(struct DuLNOde)); 14 if(!q) 15 exit(0); 16 p=q; 17 p->date=1; 18 p->next=p; 19 for(int i=2;i<=30;i++) 20 { 21 z=(struct DuLNOde*)malloc(sizeof(struct DuLNOde)); 22 if(!z) 23 exit(0); 24 z->date=i; 25 z->next=p->next; 26 p->next=z; 27 p=p->next; 28 } 29 p=q; 30 for(int i=0;i<15;i++) 31 { 32 for(int j=1;j<8;j++) 33 p=p->next; 34 printf("%d ",p->next->date); 35 p->next=p->next->next; 36 p=p->next; 37 38 } 39 }
输出结果如下:
9 18 27 6 16 26 7 19 30 12 24 8 22 5 23