算法课上的一个小练习,线性结构的表示与实现之二-------顺序表的简单应用《约瑟夫生者死者游戏》
问题描述和求解思路在源码中已经注释出来了,进攻参考,后面的一份是一开始写的,效率极低,当做反面教材了。
#include<stdio.h> /* 约瑟夫问题求解——数组存储方式算法 姓名:曹栋 题目描述: 约瑟夫生者死者游戏:30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉大家, 只有将全船一半的旅客投入海中,其余人才能幸免遇难。无奈,大家只得同意这种办法,并议定30个人围 成一圈,由第一个人开始,依次报数,数到第9个人,就把他投入大海中,然后从他的下一个人开始从1数 起,数到第9个人,再将她投入大海,如此循环,直到剩下15个人乘客为止。问哪些位置是将被扔到大海的 位置。 思路:规定数组30个元素值依次为1-30,跳水的元素置0; 循环技术变量每经过一个非0值需要加1同时报数计数变量也加1,由于是循环计数,所以将number%30, 如果经过0值时则需要只将number+1即跳过数组中的0元素,因为在报数时,已经跳水的人不再参与报数。 报数变量count累加到9后即将对应的数组元素清零,同时status变量+1; */ void main(){ int status=0;//跳水人数变量 int a[30]; int i=0; int number=0;//循环计数变量,取值范围1~算法结束时总共数过多少人 int count=0;//1-9报数变量 //初始化数组 for(i;i<30;i++) a[i]=i+1; //算法begin while(status<15){ if(a[number%30]!=0){ if(count==8){ a[number%30]=0; number++; count=0; status++; printf("第%d次跳水的为%d\n",status,number%30); } else{ count++; number++; } } else number++; } //打印结果 printf("留在船上的为:"); for(i=0;i<30;i++) if(a[i]!=0) printf("%d,",a[i]); }
下面是效率极低的一个算法
#include <stdio.h> void main(){ int a[30]; int status=0; int number=1; int j=1; int k=1; int i=1; int q=1; for(j;j<=30;j++){ a[j-1]=j; } while(status<15){ while(i<9){ while(a[(number-1)%30]==0){ number++; } i++; number++; } i=1; while(a[(number-1)%30]==0){ number++; } a[(number-1)%30]=0; number++; status++; k=1; while(k<=30){ printf("%d,",a[k-1]); k++; } printf("\n"); } printf("over \n,"); }