c语言实现生者死者游戏约瑟夫双向生死游戏是在约瑟夫生者死者游戏的基础上,假设班级所有的同学在船上,船上的的人为p,正向计数m后在反向计数n,然后再正向计数,直到剩下q个人为止。例:具体描述如下:p个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免遇难。无奈,大家只得同意这种办法,并议定p个人围成一圈,由第一个人开始,顺时针依次报数,数到第m人,便把他投入大海中,然后从他的下一个人数起,逆时针数到第n人,将他投入大海,然后从他逆时针的下一个人数起,顺时针数到第m人,再将他投入大海,如此循环,直到剩下q个乘客为止。问哪些位置是将被扔下大海的位置 要求如下: 1)初始化输入p、 m、n、q参数 2)每个人用班级同学的姓名按照学号命名 3)离开旅客的学号和姓名 4)剩余旅客的学号和姓名
时间: 2024-03-06 08:46:49 浏览: 150
下面是用C语言实现的约瑟夫双向生死游戏的代码,你可以参考一下:
```c
#include <stdio.h>
#include <string.h>
#define MAX 100
// 定义一个结构体表示旅客
struct passenger {
char name[20];
int number;
};
int main() {
// 初始化输入参数
int p, m, n, q;
printf("请输入旅客总人数p、正向报数m、反向报数n、剩余人数q:");
scanf("%d %d %d %d", &p, &m, &n, &q);
// 定义旅客数组
struct passenger passengers[MAX];
int i, j;
// 初始化旅客
for (i = 0; i < p; i++) {
sprintf(passengers[i].name, "passenger%d", i+1);
passengers[i].number = i+1;
}
// 定义出列数组
int out_list[MAX];
memset(out_list, 0, sizeof(out_list));
int out_index = 0;
// 开始游戏
int count = 0;
int pos = 0;
int direction = 1;
while (p > q) {
count++;
if (direction == 1) {
if (count == m) {
out_list[out_index++] = passengers[pos].number;
printf("%s离开了\n", passengers[pos].name);
for (j = pos; j < p-1; j++) {
passengers[j] = passengers[j+1];
}
p--;
count = 0;
} else {
pos++;
}
if (pos >= p) {
pos = 0;
}
if (p == q) {
break;
}
} else {
if (count == n) {
out_list[out_index++] = passengers[pos].number;
printf("%s离开了\n", passengers[pos].name);
for (j = pos; j < p-1; j++) {
passengers[j] = passengers[j+1];
}
p--;
count = 0;
} else {
pos--;
}
if (pos < 0) {
pos = p-1;
}
}
if (direction == 1 && count == m) {
direction = -1;
count = 0;
}
if (direction == -1 && count == n) {
direction = 1;
count = 0;
}
}
// 输出剩余旅客
printf("剩余的旅客为:\n");
for (i = 0; i < p; i++) {
printf("%s\t%d\n", passengers[i].name, passengers[i].number);
}
// 输出出列的旅客
printf("出列的旅客为:\n");
for (i = 0; i < out_index; i++) {
printf("%d\t", out_list[i]);
}
printf("\n");
return 0;
}
```
在该代码中,我们使用了一个结构体来表示旅客,其中包含旅客的姓名和编号。我们通过循环报数并出列的方式实现了约瑟夫双向生死游戏,并输出了离开和剩余的旅客信息。你可以根据需要进行修改和调整。
阅读全文