栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

约瑟夫生死游戏C/C++代码

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

约瑟夫生死游戏C/C++代码

用循环链表实现:N个乘客同乘一艘船,因为严重超载,加上风高浪大,危险万分,因此船长告诉乘客,只有将部分乘客投入海中,其余人才能幸免于难。
无奈,大家只得同意这种办法。于是N个人围成一圈(从1,2,3...N分别编号)。由编号为1的人开始,依次报数,数到第M人,便把他投入大海中,
然后再从他的下一个人数起,数到第M人,再将他扔到大海中,如此循环地进行,直到剩下K个乘客为止。按顺序依次输出被扔下大海的乘客的编号。

输入样例1:
9 3 2 
输出样例1:
3 6 9 4 8 5 2

输入样例2:
12 5 6
输出样例2:
5 10 3 9 4 12

#include 
#include
using namespace std;


typedef struct Node{
	int num;
	Node* next;

}Node;//设置节点



int *solve(int N, int M, int K) {

	Node* L, * p, * r, * q;
	int Left = N;
	static int s[1000];
	int j = 0;
	int temp;//数人头 
	L = new Node;
	L->next = NULL;//初始化
	r = L;//指向尾结点 
	q = L;
	*s = NULL;
	for (int i = 1; i <= N; i++) {
		p = new Node;
		p->num = i;
		p->next = L->next;
		r->next = p;
		r = p;
	}//上船 
	p = L;
		while (Left > K) {
			
			for (temp=1; temp <= M; temp++) {
				q = p;
				p = p->next;
				if (temp == M) {
					s[j] = p->num;
					j++;
					p = p->next;
					q->next = p;
					p = q;
				}
			}
			Left--;
		}
	
	return s;
}

int main() {
	int N, M, K;
	cin >> N >> M >> K;
	int* s;
	if (1 <= N && N <= 1000 && 1 <= M && M <= 500000 && 0 <= K && K < N) {
		
		s = solve(N, M, K);
		int i = 0;
		while (*(s + i)) {
			cout << *(s + i) << ' ';
			i++;
	}
	}
	

	return 0;

}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/443779.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号