题目链接:http://ccpc.ahu.edu.cn:8000/OJ/Problem.aspx?id=333
题目描述:
Description
牛仔的生活其实很无聊。一天,有n个牛仔,A0,A1......An-1,决定玩个游戏,他们站成一个圈,取个初始值m,第一个人数1,第二个人数2......。数到m的牛仔,站到圈外。然后,接下来的第m+1个人数1........数到第n个人时,回到第一个从新循环。最后只剩下一人。这就是著名的约瑟夫环问题。
i.e
n=5,m=3,牛仔出圈顺序是3,1,5,2,4
Input
有多组输入,每组输入n,m(1<n<=1000并且1<=m)。
Output
输出牛仔出圈的顺序,每个数后跟一个空格,每组结果占一行,后再加一个空行。
Sample Input
Original | Transformed |
5 3
7 2
Sample Output
Original | Transformed |
3 1 5 2 4
2 4 6 1 5 3 7
题目分析:
约瑟夫环,这里我提供两种方法
AC代码:
1.
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
int v[1005],n,m;
int go(int p,int t)
{
while(t--)
{
do
{
p=(p+n)%n+1;
}while(v[p]==0);
}
return p;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
v[i]=i;
int x=n,p1=0;
while(x)
{
p1=go(p1,m);
printf("%d ",v[p1]);
v[p1]=0;
x--;
}
printf("\n\n");
}
return 0;
}
2.
#include<stdio.h>
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int a[n],i,sum,del=0;
for(i=0;i<n;i++)
a[i]=i+1;
for(sum=n;sum!=0;sum--)
{
del=(del+m-1)%sum;
printf("%d ",a[del]);
for(i=del;i<=sum-2;i++)
a[i]=a[i+1];
}
printf("\n");
printf("\n");
}
}