《自杀游戏》——约瑟夫环简述

在约瑟夫环问题中,一群人站成一个圈,每数到7的人将被淘汰,直至一人幸存。通过实现约瑟夫环算法,探讨如何在特定规则下找到最后的生存者。

约瑟夫潜入到一个组织中做卧底,但是最近组织对一批人起了疑心于是让他们站成一个环,每报到7的人将被处死只留下最后一个,为了继续卧底,约瑟夫要如何才能活下去呢?

代码

//提示,开始前先看原理解析食用效果更好
#include<iostream>
using namespace std;
struct Joseph {
    int Number;                                    
    Joseph  *next, *front;
    Joseph (){ next = front = 0; }
}n[1001];//用结构体创建节点,next和front分别指向前后节点。
void Cut(Joseph *num){
    num = num->front;
    num->next = num->next->next;
    num = num->next;
    num->front = num->front->front;
}//自定义Cut函数,用于删除节点。
int main(){
    int tot, outNum=7, nowNum = 1;
    Joseph *now = n;          
    cin >> tot ; 
    for (int i = 1; i < tot - 1; i++) { 
		n[i].front = n + i - 1; 
		n[i].next = n + i + 1; 
		n[i].Number = i + 1; 
	}
    n[0].front = n + tot - 1; 
	n[0].next = n + 1; 
	n[tot - 1].front = n + tot - 2; 
	n[tot - 1].next = n;
    n[0].Number = 1; 
	n[tot - 1].Number = tot;//初始化整个约瑟夫环。
    while (tot >= 1) {//while循环查找应该删除的节点
        if (nowNum == outNum) {
            cout << now->Number <<endl;        
            Cut(now);                    
            nowNum = 1;                    
            tot--;                        
            now = now->next;            
        }
        else {
            nowNum++;                   
            now = now->next;            
        }
    }
    return 0;
}

原理解析

这是一个典型的约瑟夫环问题,在一个环中不停循环7,删除节点直到最后一个。

原理如图所示(画的有点丑)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值