约瑟夫问题

P1996

欢迎进入@shuai:约瑟夫问题;

题目背景
约瑟夫是一个无聊的人!!!

题目描述
n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号.

输入输出格式
输入格式:
n m

输出格式:
出圈的编号

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

代码如下:

#include<stdio.h>
main()
{
	int n=0,m=0;
	int a[105]={0};
	scanf("%d%d",&n,&m);
	int num=n,last=1;
	while(num){
		int t=0;
		for(int i=last;t!=m;i++){
			if(i>n){
				i%=n;
			}
			if(a[i]==-1){
				continue;
			}
			++t;
			if(t==m){
				a[i]=-1;
				num--;
				last=i+1;
				printf("%d ",i);
				break;
			}
		}
	}
	
}

代码解释:

  1. 看了此题第一反应就是队列,可惜本蒟蒻不会,,,,,请看本弱弱的模拟
  2. num 记录人数,a[i]=-1代表被踢出,i%=n报证人数在n的范围内,最后踢出一人后记得num-1就好,欢迎大佬来教我队列鸭
  3. 我觉得这是最简单的模拟约瑟夫问题了吧。
  4. 加油努力鸭!QAQ,你是中国 IT 的希望,“ — “

源代码图片及运行图片如下
在这里插入图片描述
约瑟夫问题
相关题目:
最大子数和:https://www.luogu.org/problemnew/show/P1115
表达式括号匹配:https://www.luogu.org/problemnew/show/P1739
队列安排:https://www.luogu.org/problemnew/show/P1160
发现错误,疑惑不解,联系作者:[email protected]
欢迎联系呦 -------- QAQ ---------;