- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
关于约瑟夫环的解法
关于约瑟夫环的解法
自己曾经考过三级遇到过一些问题,自己也琢磨过其中有一道排队的题目叫“约瑟夫环”。自己曾经查过一些资料答案有几种有的用链表解决思路清晰,但对初学链表的人却不是很好理解,有的用数组排列的方法解决程序干净简洁但其中有一段对初学者也较为困难。经过我自己研究我找到了一种理解起来相对较容易的方法,可能程序运行效率不如上面第二种高但对有一定基础的初学者还是比较容易的。
首先我们看一道题目:有一组数,1,2,3,4,5,6。请通过数组元素移动的方法将其变为4,5,6,1,2,3。很简单:
main()
{
int a[6]={1,2,3,4,5,6};
int t,i,j;
for(i=0;i3;i++)//向左移动三次
{
t=a[0];//将第一个元素首先保护起来
for(j=0;j5;j++)
a[j]=a[j+1];//向左移动一个位置
a[j]=t;//降第一个元素放至最后一位
}
} 理解了上面这道题,约瑟夫环就快解决了;
按照题目的要求我们是要把报到M的人提出来排队,如果我们把报到M的人放到到最后一位,并且下一次报数时不让他参与问题就简单了
我们假设要把报道3的人踢出队伍,而且从第一个人开始报数
1←2←3←4←5←6←7←8←9←10;
2←3←4←5←6←7←8←9←10←1
3←4←5←6←7←8←9←10←1←2
4←5←6←7←8←9←10←1←2←3
经过第一轮报数得:4←5←6←7←8←9←10←1←2←3
其实这个过程是让整个队伍向前走,第一个人走到队尾第二个人跟到第一个人后面,第三个人跟到第二个人后面,当第三个人走到对尾时第一轮结束,并且剩下的九个人准备开始下一轮
这就犹如一个游戏:
有一对人编号为1——10,游戏开始第一个人报1完成此轮报数并且走到对尾,第二个人报2完成此轮报数并且走到对尾,第三个人报3完成此轮报数,走到现有10人的对尾并且不再参加下一轮报数。剩余九人保持现有相对顺序不变,继续按照前述规则进行,此轮报到3的人站在现有9人的对尾。如此继续,报数的人越来越少,报过3的人也自成一队列。
第一轮后的结果:4←5←6←7←8←9←10←1←2←3;
5←6←7←8←9←10←1←2←4←3
6←7←8←9←10←1←2←4←5←3
7←8←9←10←1←2←4←5←6←3
第二轮结果:7←8←9←10←1←2←4←5←6←3
do
{
for(i=0;im;i++)
{
t=p[0];
for(j=0;jn-1;j++)
p[j]=p[j+1];
p[j]=t;
}//这段for代码与前面的例子完全一样只不过n在变化
}while(n--);//直到将所有位置都排上人,每排一轮就有一个人退出,不再参加下一轮 这段代码是完成人员的排列移动其中最关键就是运用do……while,n--表示每轮报数结束后对尾那个报3的人不再参加下一轮报数。
接下来就需要满足从第S个人开始的要求,为了简便我们将给成员编号和从第S个人开始的要求同时满足
for(i=0;in;i++)
{
if(i+s=n)
p[i]=i+s;
else
p[i]=i+s-n;
}//给数组中赋值,同时将第S个人排到了第一位。
设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第个m人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所有的人都出圈为止。现要求按出圈次序,每10人一组,给出这n个人的顺序表。请考生编制函数Josegh()实现此功能并调用函数WriteDat()把结果p输出到文件OUT.DAT中。
设n=100,c=1,m=10。
(1)将1到n个人的序号存入一维数组p中;
(2)若第i个人报数后出圈,则将p[i]置于数组的倒数第i个位置上,而原来第i+1个至倒数第i个元素依次向前移动一个位置;
(3)重复第(2)步直至圈中只剩下p[1]为止。
部分源程序已给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。
#include stdio.h
#define N 100
#define S 1
#define M 10
int p[100],n,s,m;
void WriteDat(void);
void Josegh(void)
{
int n,s,m,t,i,j;
n=N;
s=S;
m=M;
for(i=0;in;i++)
{
if(i+s=n)
p[i]=i+s;
else
p[i]=i+s-n;
}//给数组中赋值,同时将第S个人排到了第一位
do
{
for(i=0;im;i++)
{
t=p[0];
for(j=0;jn-1;j++)
p[j]=p[j+1];
p[j]=t;
}
}while(n--);//直到将所
文档评论(0)