问题描述:
在一间房间总共有n个人(下标0~n-1),只能有最后一个人活命。
按照如下规则去杀人:
所有人围成一圈
顺时针报数,每次报到q的人将被杀掉
被杀掉的人将从房间内被移走
然后从被杀掉的下一个人重新报数,继续报q,再清除,直到剩余一人
解法:
使用循环数组模拟这一圈人。下标代表人的报数编号,数据代表人的状态(1 -已被杀/0 -存活)
#include <iostream>
using namespace std;
void joseph(int Total, int k)
{
int count = 0;
int alive = Total;
int *circle = (int*)malloc(sizeof(int)*Total);
for (int i = 0; i < Total; i++)
circle[i] = 0;
for (int i = 0; i < Total; i++)
{
if (circle[i] == 0)
{
count++;
if (count == k)
{
circle[i] = 1;
alive--;
alive == 0 ? cout << i + 1 << endl : cout << i + 1 << ", ";
if (alive == 0) break;
count = 0;
}
}
if (i == Total - 1) i = -1;
}
free(circle);
}
int main()
{
int total, k;
cin >> total >> k;
joseph(total, k);
}