注册 登录
编程论坛 C++教室

一个简单的问题 望指教

leng 发布于 2007-08-11 10:02, 1117 次点击
若干个人围坐在一起,从某个人开始报数,报到某个数字就将报该数的人杀死,最后剩下的那个人获胜。编一个程序:有12个人围坐在一起从序号为2的人开始报数,杀掉报4的人,被杀的顺序是6,10,2,7,12,5,1,9,8,11,4。最后3获胜。
18 回复
#2
aipb20072007-08-11 10:57
搜索 约瑟夫环

简单的用循环数组模拟,也可以直接用数学式子解决(前不久有看到,这里)。
#3
leng2007-08-11 11:39
用循环数组模式的话,怎样解决比如10被杀掉后,再循环跳到2呀???
#4
aipb20072007-08-11 12:26

i < 12-1 ? ++i : i = 0

这样就可以保证循环。

[此贴子已经被作者于2007-8-11 12:51:35编辑过]

#5
leng2007-08-11 13:21
谢谢  仔细研究中。。。。。。
#6
狂人老大2007-08-12 11:00
你看看吧
有什么可以改进一下
#include<stdio.h>
void main()
{
int k=0,i,a[12],m=0;
for(i=0;i<12;i++)
a[i]=1;
for(i=2;;i++)
{
if(i==12)i=0;
if(a[i]==0)
continue;
else
k++;
if(k==4)
{
a[i]=0;
printf("%d\n",i+1);
k=0;
m++;
}
if(m==12)break;
}
}
#7
leng2007-08-12 11:13
#8
HJin2007-08-12 11:27
回复:(leng)一个简单的问题 望指教

/*---------------------------------------------------------------------------
File name: Josephus_nth_victim.cpp
Author: HJin (email: fish_sea_bird [at] yahoo [dot] com )
Created on: 8/11/2007 20:23:48
Environment: Windows XP Professional SP2 English +
Visual Studio 2005 v8.0.50727.762


Modification history:
===========================================================================

Sample output

12 4 2
5 9 1 6 11 4 12 8 7 10 3 2

41 3 1
3 6 9 12 15 18 21 24 27 30 33 36 39 1 5 10 14 19 23 28 32 37 41 7 13 20 26 34 40
8 17 29 38 11 25 2 22 4 35 16 31

*/

#include <iostream>

using namespace std;

/** nth_victim of the Josephus circle.
* @param n --- number of people
* @param m --- step number
* @param s --- start
* @param k --- kth victim
* @return returns the original index of the kth victim.
*/
int nth_victim(int n, int m, int s, int k)
{
int p=k*m;
while(p>n)
p=(m*(p-n)-1)/(m-1);

p=(p+s-1)%n;
if(p==0)
p=n;

return p;
}


int main()
{
int n, m, s, k;
while(cin>>n>>m>>s)
{
for(k=1; k<=n; ++k)
cout<<nth_victim(n, m, s, k)<< " ";
cout<<endl<<endl;
}

return 0;
}

#9
aipb20072007-08-12 11:48
[CODE]#include <iostream>
using namespace std;

#define n 12
int main(){
int a[] = {1,2,3,4,5,6,7,8,9,10,11,12};
int i = 2,j = 0,killed = 0;
while (killed != n){
if (a[i])
++j;
if (j == 4){
cout << a[i] << " ";
++killed;
j = 0;
a[i] = 0;
}
i < n-1 ? ++i : i=0;
}
cout << "\n";
system("pause");
}[/CODE]
#10
狂人老大2007-08-12 11:49
哥们儿   我运行你的程序  怎么会没有结果出来啊
#11
狂人老大2007-08-12 11:52
回复:(HJin)回复:(leng)一个简单的问题 望指教...

哥们儿 我运行你的程序
怎么会没有结果出来呢

#12
aipb20072007-08-12 11:53
以下是引用狂人老大在2007-8-12 11:49:23的发言:
哥们儿 我运行你的程序 怎么会没有结果出来啊

我的吗?
有结果啊,HJIN的也有结果啊!

#13
狂人老大2007-08-12 11:55
回复:(aipb2007)[CODE]#include u...
#14
狂人老大2007-08-12 11:56
我运行HJIN的没有结果啊
是哪里除了问题吗
#15
狂人老大2007-08-12 11:59
哦  不好意思啊   复制错了
#16
leng2007-08-12 12:00
  谢谢 各位了  
#17
狂人老大2007-08-12 12:03
回复:(HJin)回复:(leng)一个简单的问题 望指教...
误会你了 我的错 我有罪
你的才是最强大的
#18
leng2007-08-12 12:04
HJin的程序最爽嘛  高
#19
xmt0072007-08-13 20:27
1