紫书 UVA133
循环模拟的水题,类似约瑟夫环,主要难点是判断到达界限然后取模。
题目很坑,注意开始p1=n-1,p2=0,当停到某个下标时应从 下一个下表数起
我的思路如下
#include<iostream>
using namespace std;
int n,k,m,a[25];
int go(int p,int d,int t)
{
while(t--)
{
/*while(a[p]==0)
{
p=(p+d+n)%n;
}*/
p=(p+d+n)%n;
while(a[p]==0)
{
p=(p+d+n)%n;
}
}
return p;
}
int main()
{
while(cin>>n>>k>>m&&n&&k&&m)
{
for(int i=0;i<n;i++)
a[i]=i+1;
int left=n,p1=n-1,p2=0;
while(left)
{
p1=go(p1,1,k);
p2=go(p2,-1,m);
printf("%3d",a[p1]);
left--;
if(p1!=p2)
{
printf("%3d",a[p2]);
left--;
}
a[p1]=a[p2]=0;
if(left)cout<<",";
}
cout<<endl;
}
return 0;
}
紫书上的判断循环是p=(p+d+n-1)%n+1,我感觉我这种水平写不出来这么简洁但不好理解的代码。。