题意:双层约瑟夫 其实就是个升级版约瑟夫环 从两端同时开始走 停止位置的人被踢出 若停在同一人 只输出一次数 否则先输出顺时针 后输出逆时针(只是函数运算顺序而已 可随意调换 输入三个数 总人数 顺时针步数 逆时针步数 以0 0 0结束程序
输出需要注意每个数字占三格 即格式化输出
输入样例:
10 4 3 0 0 0输出样例:
4
8,
9
5,
3
1,
2
6,
10,
7
是空格位置
解题思路:每次输入N都把数组1~N位重置 0位无所谓 同样用0标记被选过的人 用0来循环 卡住的是移动时候的计算 *direct=(*aea+s+N-1)%N+1 s决定顺逆行走即1/-1 N为总人数 aea即位置
代码如下:
#include
#include
using namespace std;
int area[22];
int man,N;
void remem(int N)
{
while(N)
{
area[N] = N;
N--;
}
}
int Move(int s,int step,int *aea)
{
while(step--)
{
do{
*aea=(*aea+s+N-1)%N+1;
}while(area[*aea]==0);//原本用的while结果发现无法进行direct增减 于是搬出来do-while 发现do-while的用武之地了
//cout<<*aea<<" ";
}
//cout<
> N >> k >> m && N)
{
flags = 0;
man = 0;
lef = 0;
righ = N+1;
remem(N);
while(man != N)
{
if(flags)
cout << ',';
else flags = 1;
sl = Move(1,k,&lef);
sr = Move(-1,m,&righ);
area[lef]=0;
area[righ]=0;
cout << setw(3) << sl;
man++;
if(sl!=sr){
cout << setw(3) << sr;
man++;
}
}
cout<