约瑟夫问题

约瑟夫问题

约瑟夫问题:P1996 约瑟夫问题 洛谷

n 个人围成一圈,从第一个人开始报数,数到 m的人出列,再由下一个人重新从 1 开始报数,数到 m的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

思路通过结构体存储每一个编号,并存储 pre, nxt,循环处理报到 m就将(输出该编号)对应编号的 pre, nxt处理,使下一次循环是可以跳过该编号;

代码实现:

#include<bits/stdc++.h>
using namespace std;

int n, m;

struct node{
	int id, nxt, pre;
}a[110];

int main(){
	cin >> n >> m;
	if(n == 0 || m == 0) return 0;
	for(int i = 1; i <= n; i ++){
		a[i].id = i;
		a[i].nxt = i + 1;
		a[i].pre = i - 1;
	}
	
	a[1].pre = n;
	a[n].nxt = 1;
	int k = 1, num = 1;
	while(a[k].id != a[k].nxt){
		if(num == m){
			cout << k << " ";
			int pre = a[k].pre;
			a[pre].nxt = a[k].nxt;
			int nxt = a[k].nxt;
			a[nxt].pre = a[k].pre;
			num = 0;
		}
		k = a[k].nxt;
		num ++;
	}
	
	cout << k << endl;
	return 0;
}
posted @ 2021-11-30 23:01  Altwilio  阅读(71)  评论(0编辑  收藏  举报