1008: Josephus环
时间限制: 1 Sec 内存限制: 128 MB提交: 444 解决: 191
[ 提交][ 状态][ 讨论版]
题目描述
任给正整数n、k,按下述方法可得排列1,2,……,n的一个置换:将数字1,2,.. .,n环形排列,按顺时针方向从1开始计数;计满K时输出该为之上的数字(并从环中删去该数字),然后从下一个数字开始继续计数,直到环中所有数字均被输出为止。试编写一算法,对输人的任意正整数n、k(k<=n<=1000),输出相应的置换。
输入
单组数据,包含2个整数n、k(0<k<=n<=1000)。
输出
输出1行,包含n个整数(含义如题目描述),用空格分割。
行末不要有多余的空格。
样例输入
10 3
样例输出
3 6 9 2 7 1 8 5 10 4
思路:直接拿数组模拟就好,记得每次下标超过n时将它归为1~
上代码
#include<cstdio>
#include<vector>
int main()
{
int j[1010];
int k,n;
int index=0;
scanf("%d%d",&n,&k);
int left=n;
for(int i=0;i<=n;i++)
j[i]=i;
while(left!=0)
{
for(int l=1;l<=k;l++)
{
if(index+1>n)
index=0;
if(j[index+1]!=-1)
{
index++;
if(index>n)
index=1;
}
else
{
index++;
l--;
if(index>n)
index=1;
}
}
j[index]=-1;
left--;
if(left==0)
printf("%d",index);
else
printf("%d ",index);
}
return 0;
}