经典算法之约瑟夫问题


  1     /**************************************************************************************
2 * Function : 约瑟夫问题
3 * Create Date : 2014/04/20
4 * Author : NTSK13
5 * Email : [email protected]
6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性。
7 任何单位和个人不经本人允许不得用于商业用途
8 * Version : V0.1
9 ***************************************************************************************
10
11 题目:
12 约瑟夫问题
13
14 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出
15     圈子,问最后留下的是原来第几号的那位
16 分析:
17 //My anser:
18 常规解法,模拟数数自杀过程。自杀的人下次数数直接跳过。
19 **************************************************************************************/
20 #include<stdio.h>
21
23 #define MY_FUNC 1
24 #if MY_FUNC
25
27 #define N 3//数到3
28 #define M 41
29 int data[]={0};
30
32 int remain(int n);
33 //the first solution:
34 int main()
35 {
36 int ret=0;
39 ret=remain(M);
40
41 printf("The last remain number is: %d \n",ret);
42 fflush(stdout);//修复Eclipse printf()不能显示的小bug
45 return 0;
46 }
47
48
49 int remain(int n)
50 {
51 int i=0,j=0,die=0;
52 int current=1,k=1;

55 for(j=0;j<n;j++)
56 data[j]=j+1;
57
59 while(die<n)
60 {
61 if(current==N+1)//顺序数数123,123,....
62 current=1;
65 if(current==N)//数到3的时候,要移除一个不为0的数,为0 代表人已自杀死去
66 {
67 j=i;
68 if(j>n)
69 j=j%n;
70 while(1)//remove a death
71 {
72 if(data[j]!=0)
73 {
74 data[j]=0;
75 printf("第%d个死去的人编号是: %d \n",k++,j+1);
76 fflush(stdout);
77 die++;
78 break;
79 }
80 else
81 {
82 j++;
83 if(j==n)
84 j=0;
85 }
86 }
87 if(die==n)
88 break;
89 }
90 else//数数序列号不为3的时候,继续数数,但是要跳过死去的人
91 {
92 while(1)//jump death
93 {
94 if(data[i]!=0)
95 break;
96 else
97 {
98 i++;
99 if(i==n)
100 i=0;
101 }
102 }
103 }
104
105
106 current++;//计数加一
107 i++; //
108 if(i==n)
109 i=0;
110 }
111
112 return j+1;
113 }
114 #else
115 /************************************************************************************/
116
117
118 //the second solution:
119
120 #include <stdio.h>
121 #include <stdlib.h>
122 #define N 41
123 #define M 3
124 int main()
125 {
126 int man[N]={0};
127 int count=1;
128 int i=0,pos=-1;
129 int alive=0;
130 while(count<=N)
131 {
132 do{
133 pos=(pos+1) % N; //环状处理
134 if(man[pos]==0)
135 i++;
136 if(i==M) //报数3的人
137 {
138 i=0;
139 break;
140 }
141 }while(1);
142 man[pos]=count;
143 count++;
144 }
145 printf("\n约瑟夫排列(最初位置-约瑟夫环位置):\n");
146 fflush(stdout);
147 for(i=0;i<N;i++)
148 {
149 printf("%d-%d ",i+1,man[i]);
150 fflush(stdout);
151 if(i!=0 && i%10==0) //每输出10个则换行
152 {
153 printf("\n");
154 fflush(stdout);
155 }
156 }
157 printf("\n\n请输入准备剩下的人数:\n");
158 fflush(stdout);
159 scanf("%d", &alive);
160 printf("这%d人初始位置应排在以下序号:\n",alive);
161 fflush(stdout);
162 alive=N-alive;
163 for(i=0;i<N;i++)
164 if(man[i]>alive)
165 {
166 printf("初始序号:%d,约瑟夫环序号:%d\n",i+1,man[i]);
167 fflush(stdout);
168 }
169 printf("\n");
170 fflush(stdout);
171 getch();
172 return 0;
173 }

176 #endif

经典算法之约瑟夫问题,码迷,mamicode.com

时间: 2024-11-28 21:19:13

经典算法之约瑟夫问题的相关文章

经典算法mark

在平时找工作的时候,或多或少会遇到一些算法问题,很多都是比较经典或者网上已经流传很久的.只是我们没有接触过,所以不知道怎么解决. 在这儿,我自己总结一些我遇到的一些经典算法,给自己增加一点记忆,也给需要的朋友看到学习一下. 1. 倒水问题 如题:一个容量为5升的杯子和一个容量为3升的杯子,水不限使用,要求精确得到4升水. 这类题一般会有两种出题方式: A.简答 这儿先给出简答的答案:其实结果又很多种,这儿给出倒水次数最少的一种. B.编程实现 解法也比较多,我首先想到的DFS(深度优先)搜索,每

小猪的数据结构辅助教程——2.5 经典例子:约瑟夫问题的解决

小猪的数据结构辅助教程--2.5 经典例子:约瑟夫问题的解决 标签(空格分隔): 数据结构 约瑟夫问题的解析 关于问题的故事背景就不提了,我们直接说这个问题的内容吧: 一堆人,围成一个圈,然后规定一个数N,然后依次报数,当报数到N,这个人自杀,其他人鼓掌!啪啪啪, 接着又从1开始报数,报到N又自杀-以此类推,直到死剩最后一个人,那么游戏结束! 这就是问题,而我们用计算机模拟的话,用户输入:N(参与人数),M(第几个人死),结果返回最后一个人! 类似的问题有跳海问题,猴子选王等,下面我们就以N =

【经典算法大全】收集51种经典算法 初学者必备

<经典算法大全>是一款IOS平台的应用.里面收录了51种常用算法,都是一些基础问题.博主觊觎了好久,可悲哀的是博主没有苹果,所以从网上下了老奔的整理版并且每个都手敲了一遍. 虽然网上也有博客贴了出来,但是自己写写感觉总是好的.现在分享个大家. 代码和运行结果难免有出错的地方,请大家多多包涵. 1.河内之塔(汉诺塔) 2.费式数列 3.巴斯卡三角形 4.三色棋 5.老鼠走迷宫(1) 6.老鼠走迷宫(2) 7.骑士走棋盘 8.八皇后 9.八枚银币 10.生命游戏 11.字串核对 12.双色河内塔,

经典算法大全

原文地址:经典算法大全 作者:liurhyme 经                                                                    典                                                                    算                                                                    法                  

JAVA经典算法50题(转)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51097928 JAVA经典算法50题 [程序1]   题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... [java] view plain copy public class Demo01 { public s

数据挖掘十大经典算法

一. C4.5  C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3 算法.   C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进: 1) 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足: 2) 在树构造过程中进行剪枝: 3) 能够完成对连续属性的离散化处理: 4) 能够对不完整数据进行处理. C4.5算法有如下优点:产生的分类规则易于理解,准确率较高.其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导

动态展示十大经典算法

算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序n个项目要Ο(nlogn)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(nlogn)算法更快,因为它的内部循环(innerloop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divideandconquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1.从数列中挑出一个元素,称为“基准”(pivot),

数据挖掘领域十大经典算法初探

译者:July   二零一一年一月十五日 ----------------------------------------- 参考文献:国际权威的学术组织ICDM,于06年12月年评选出的数据挖掘领域的十大经典算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART.==============博主说明:1.原文献非最新文章,只是本人向来对算法比较敏感.感兴趣,便把原文细看了下,翻译过程中

【白话经典算法系列之十七】 数组中只出现一次的数 其他三次

本文地址:http://blog.csdn.net/morewindows/article/details/12684497转载请标明出处,谢谢. 欢迎关注微博:http://weibo.com/MoreWindows 首先看看题目要求: 数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次.请给出最快的方法找到x. 这个题目非常有意思,在本人博客中有<位操作基础篇之位操作全面总结>这篇文章介绍了使用位操作的异或来解决——数组中其他数字出现二次,而x出现一次,找出x.有<