1018.选太子(select the prince)
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
某皇帝有2m个儿子,现在要从中选出一个做太子,皇帝不知道该把那一个皇子立为太子,于是决定用下面的方法来选出太子,设每个太子的编号分别1、2、3、…、2m,按顺时针方向站成一个圆圈,现在从1号太子开始按顺时针方向数,数到第n个人,把他淘汰出局,然后从他的下一个人开始上述过程,当第m个人被淘汰时,转变方向继续从1开始数,重复上述过程,最后剩下的皇子将被立为太子。现在请你写一个程序,计算出几号皇子将被立为太子。
输入
输入两个正整数m n
Input two positive integer.
输出
输出太子的编号
Output the number.
输入样例
3 2
输出样例
1
本题需要考虑的一个问题是如何构造一个环状的结构,起初打算使用链表,但在剔除数字后还要逆时针旋转,操作起来较为麻烦,后来想到可以通过取模运算进行模拟环的遍历。
#include<iostream>
using namespace std;
int main(){
int m, n;
cin >> m >> n;
int loop[1000] ={0};//存储太子的环
int i = 0;
int princeCount = 2*m, outCount = 0;
int step = 0;
int flag = 1; // flag = 1顺时针 -1逆时针;
//当循环中太子的个数为1则循环终止
while(outCount < princeCount - 1){
if(loop[i] == 0){
step++;
if(step == n){
loop[i] = 1;
outCount++;
if(outCount == m){
flag = -flag;
}
step = 0;
}
}
if(flag == 1){
i = (i + 1) % princeCount;//顺时针取下一位地址
}else{
i = (i - 1 + princeCount) % princeCount;//逆时针取下一位地址
}
}
int j;
for(j = 0; j < princeCount; j++){
if(loop[j] == 0){
cout << j + 1 << endl;
}
}
}