这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。运行结果:#include<iostream> using namespace std; bool isExit(int* cricle, int i){ return cricle[i] == 1 ? true : false; } int safe(int i, int len){ return i%len; } int mark(int* cricle,int begin, int step, int len){ int i; for(i=begin;step>0;i=safe(i+1,len)){ if(i==0){ continue; } if(!isExit(cricle,i)){ step--; }else continue; } if(i==0) cricle[30] = 1; else cricle[i-1] = 1; return i; } void markPerson(int* cricle,int begin, int step, int count,int len){ if(count == 0) return; int index = mark(cricle,begin,step,len); count--; markPerson(cricle,index,step,count,len); } void output(int* cricle, int len){ for(int i=1;i<len;i++){ cout<<i<<":"<<cricle[i]<<" "; } cout<<endl; } void main(){ int cricle[31] = {0}; int len = sizeof(cricle)/sizeof(cricle[0]); markPerson(cricle,1,9,15,len); output(cricle,len); }
其中标记为1的为非教徒
约瑟夫环问题
最新推荐文章于 2022-05-04 19:46:17 发布