约瑟夫法环(循环链表)

一开始有n个人,以此按顺序持有一个编号,报到m的数字的那个人会淘汰,下一个人要继续从1开始报数,那么最后总会剩下一个人为幸存者

这个问题的难点就是到后面的话,淘汰掉的人会越来越多,那怎么处理这些空缺呢,比如说编号为2,3,4的人都淘汰的话,此时编号为1的人喊1,那么编号为5的人要继续喊2,这个问题和我们编程里面的continue功能类似,所有我们可以用continue来解决,直接跳过淘汰的人,从而不让计数器相加

具体代码段如下:

#include <iostream>
#include <stdio.h>
using namespace std;
typedef struct list{
	int a;
	struct list *next;
}list,*yue;//节点的结构体 
int main()
{
	yue head,p,r;//三个指针 
	int i,n,m,j,t;
	cout<<"请输入玩这个死亡游戏的总人数:"; 
	cin>>n;//游戏总人数 
	printf("已经为玩这个死亡游戏的人编好号,依次是从1到%d号",n);
	cout<<endl;
	cout<<"请输入喊数字几的人死:";
	cin>>m;//喊到死的数字 
	cout<<"请输入最后剩余的幸存者个数:";
	cin>>t;
	head=new list;
	head->next=NULL;
	r=head;
	for(i=0;i<n;i++)//为所有玩家编号 
	{
		p=new list;
		p->a=i+1;
		p->next=NULL;
		r->next=p;
		r=p;
	}
	r->next=head->next;//连接循环链表 
	p=head;//p从head开始进入循环 
	for(i=0;i<n-t;i++)
	{
		for(j=0;j<m;)
		{
			p=p->next;
			if(p->a==0)//如果这之间路过了已经死掉的人,则跳过 
			{
				continue;
			}
			else
			{
				if(j==m-1)//到了死亡的序号 
				{
					p->a=0;
				}
				j++;
			}
		}
	}
	head=head->next;//head指针遍历链表(寻找幸存者) 
	r->next=NULL;//循环链表断开,否则会进入死循环 
	cout<<"最后的幸存者的编号为:";
	while(head!=NULL)//遍历链表操作(寻找幸存者) 
	{
		if(head->a!=0)
		{
			cout<<head->a<<" ";
		}
		head=head->next;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值