scau 约瑟夫(josephus)环 (模拟)

Description

约瑟夫(josephus)环是这样的:假设有n个小孩围坐成一个圆圈,并从1开始依次给每个小孩编上号码。老师指定从第s位小孩起从1开始报数,当数到m时,对应的小孩出列,依次重复,问最后留下的小孩是第几个小孩?例如:总共有6个小孩,围成一圈,从第一个小孩开始,每次数2个小孩,则游戏情况如下:    小孩序号:1,2,3,4,5,6    离开小孩序号依次为:2,4,6,3,1最后获胜小孩序号:5

 输入格式

每组输入是三个整数n,s,m。(1 <= n <= 30, 1 <= s <= n,1 <= m <= 10) ;

 输出格式

对于每组输入,请输出最后留下小孩的序号。 

输入样例

6 1 2

输出样例

5

 1 #include <stdio.h>
 2 int sum(int a[],int n)
 3 {
 4     int i,s=0,f;
 5     for(i=0; i<n&&s<=1; i++)
 6     {
 7         s+=a[i];
 8         if(s>1)  return 0;
 9         else if(s==1&&a[i]) f=i;
10     }
11     return f+1;
12 }
13 int main()
14 {
15     int n,s,m,i,j,f,k;
16     scanf("%d%d%d",&n,&s,&m);
17     int num[n];
18     for(i=0; i<n; i++)
19         num[i]=1;
20 
21     for(j=s-1; !(f=sum(num,n));)
22     {
23         k=1;
24         for(j=(j+1)%n; k<=m&&!(f=sum(num,n)); j=(j+1)%n)
25         {
26             if(num[j]==1&&k<=m)
27             {
28                 k++;
29             }
30             if(k==m)
31             {
32                 num[j]=0;
33                 break;
34             }
35         }
36         while(num[j]==0&&!(f=sum(num,n)))
37         {
38             j=(j+1)%n;
39         }
40     }
41     printf("%d",f);
42 }
My Code

 

posted @ 2015-09-28 23:18  cherry_yue  阅读(101)  评论(0)    收藏  举报