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

约瑟夫潜入到一个组织中做卧底,但是最近组织对一批人起了疑心于是让他们站成一个环,每报到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,删除节点直到最后一个。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值