PTA候启明犯规七人大战函数题目的参考答案
时间: 2023-11-14 08:05:02 浏览: 41
PTA候启明犯规七人大战函数题的参考答案如下:
思路:根据题目要求,设计三个函数:`int getNext(int i, int a[], int n)`用于找到下一个存活的人的编号;`int playGame(int n, int m, int k)`用于模拟游戏过程,返回最后剩余的k个人的编号;`void printResult(int a[], int k)`用于输出剩余的k个人的编号。具体实现细节见代码注释。
```c
#include <stdio.h>
#define MAXN 10010
int getNext(int i, int a[], int n) {
i++; // 下一个人
if (i > n) i -= n; // 如果已经到了最后一个人,又从第一个人开始
while (a[i] == 0) { // 如果当前轮到的人已经被出局,继续向后找
i++;
if (i > n) i -= n;
}
return i;
}
int playGame(int n, int m, int k) {
int a[MAXN] = {0}; // 数组a记录每个人当前的状况,1代表存活,0代表已出局
int cnt = n; // 初始有n个人存活
int i = 0, j = 1; // i表示当前出局人的编号,j表示当前轮到的人的编号
while (cnt > k) { // 当存活人数小于等于k时结束游戏
i = getNext(i, a, n); // 找到下一个出局的人
j = getNext(j, a, n); // 找到下一个轮到的人
if (cnt == m) { // 如果当前存活人数等于m,输出当前轮到的人的编号
printf("%d\n", j);
cnt--; // 存活人数减1
}
j = getNext(j, a, n); // 下一个人轮到
cnt--; // 存活人数减1
a[j] = 0; // 当前轮到的人出局
}
for (int i = 1; i <= n; i++) { // 返回最后剩余的k个人的编号
if (a[i] == 1) {
return i;
}
}
return 0;
}
void printResult(int a[], int k) {
for (int i = 1; i <= k; i++) { // 输出剩下的k个人的编号
printf("%d ", a[i]);
}
}
int main() {
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
int ans[MAXN] = {0}; // 数组ans记录最后剩余的k个人的编号
int cnt = 0; // 已经得到的最后剩余的人数
for (int i = 1; i <= n && cnt < k; i++) { // 从每个人开始模拟游戏,直到得到k个最后剩余的人
if (playGame(n, m, k) == i) { // 如果当前人在最后剩余的k个人中,记录其编号
ans[++cnt] = i;
}
}
printResult(ans, k); // 输出剩余的k个人的编号
return 0;
}
```