#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
int main()
{
int i,j,w,s,n;
char a[65][16];
int p[65];
scanf("%d",&n);
for(i=1;i<=n;i++)
{
p[i]=i;
scanf("%s",&a[i]);
} scanf("%d,%d",&w,&s);
w=(w+n)%n; while(n-1){ w=(w+s-1)%n;
printf("%s\n",a[p[w]]);
for(j=w;j<n;j++)
p[j]=p[j+1];
n--;
cout<<w<<" "<<n<<endl;
}
return 0;
}
//WA代码↑
POJ3750
题意:约瑟夫环问题。
输入:
n(人数)
str(人的姓名)
w(起始下标)s(间隔人数)
输出:
str(人的姓名)
思路:约瑟夫环问题,直接模拟起始w=(w+n-1)%n,出去下标w=(w+s-1)%n,在后面要把环的下标更新即可。
AC代码:
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
int main()
{
int i,j,w,s,n;
char a[65][16];
int p[65];
scanf("%d",&n);
for(i=0;i<n;i++)
{
p[i]=i;
scanf("%s",&a[i]);
} scanf("%d,%d",&w,&s);
w=(w+n-1)%n; while(n){ w=(w+s-1)%n;
printf("%s\n",a[p[w]]);
for(j=w;j<n-1;j++)
p[j]=p[j+1];
n--;
// cout<<w<<" "<<n<<endl;
}
return 0;
}