Qt C++春晚刘谦魔术约瑟夫环问题的模拟程序

什么是约瑟夫环问题?

约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。
分析:
(1)由于对于每个人只有死和活两种状态,因此可以用布尔型数组标记每个人的状态,可用true表示死,false表示活。
(2)开始时每个人都是活的,所以数组初值全部赋为false。
(3)模拟杀人过程,直到所有人都被杀死为止。

魔术

1、4张牌对折后撕开,就是8张,叠放在一起就是ABCDABCD。注意,ABCD四个数字是完全等价的。
2、根据名字字数,把顶上的牌放到下面,但怎么放都不会改变循环序列的相对位置。譬如2次,最后变成CDABCDAB;譬如3次,最后换成DABCDABC。但无论怎么操作,第4张和第8张牌都是一样的。
3、把顶上3张插到中间任意位置。这一步非常重要!因为操作完之后必然出现第1张和第8张牌是一样的!以名字两个字为例,可以写成BxxxxxxB(这里的x是其他和B不同的牌)。
4、拿掉顶上的牌放到一边,记为B。剩下的序列是xxxxxxB,一共7张牌。
5、南方人/北方人/不确定,分别拿顶上的1/2/3张牌插到中间,但是不会改变剩下7张牌是xxxxxxB的结果。
6、男生拿掉1张,女生拿掉2张。也就是男生剩下6张,女生剩下5张。分别是xxxxxB和xxxxB。
7、把最顶上的放到最底下,循环7次,男生和女生分别会是xxxxBx和xxBxx。
8、最后执行约瑟夫环过程!操作到最后只剩下1张。当牌数为6时(男生),剩下的就是第5张牌;当牌数为5时(女生),剩下的就是第3张牌。就是第4步拿掉的那张牌!

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1157e96989d6436ea8772e76b1130263.png

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <vector>
#include "brand.h"
#include <QPushButton>
#include <QRadioButton>
#include <QLineEdit>
#include <QLayout>
#include <QStackedWidget>
#include <QSplitter>
#include <QButtonGroup>
class Step: public QWidget
{
public:Step(QWidget *parent = 0):QWidget(parent){QVBoxLayout* vbox = new QVBoxLayout(this);QHBoxLayout* hboxLabel = new QHBoxLayout;hboxChoose = new QHBoxLayout;QHBoxLayout* hboxBtn = new QHBoxLayout;label = new QLabel(this);hboxLabel->addStretch();hboxLabel->addWidget(label);hboxLabel->addStretch();hboxBtn->addStretch();vbox->addLayout(hboxLabel);vbox->addLayout(hboxChoose);vbox->addLayout(hboxBtn);}void SetText(QString text){label->setText(text);}QHBoxLayout* GetChooseLayout(){return hboxChoose;}virtual bool Check() {return true;}
private:QLabel* label;QHBoxLayout* hboxChoose;
};class Start: public Step
{
public:Start(QWidget *parent = 0):Step(parent){SetText("请输入四个数字、字母或汉字");edit = new QLineEdit(this);edit->setPlaceholderText("请输入四个数字、字母或汉字");GetChooseLayout()->addWidget(edit);}QString GetStr(){return edit->text();}bool Check() {return edit->text().size() == 4;}private:QLineEdit* edit;
};class First: public Step
{
public:First(QWidget *parent = 0):Step(parent){SetText("4张牌对折后撕开");}
};class Second: public Step
{
public:Second(QWidget *parent = 0):Step(parent){SetText("请输入您的名字");edit = new QLineEdit(this);edit->setPlaceholderText("请输入您的名字");GetChooseLayout()->addWidget(edit);}int GetNumber(){return edit->text().size();}bool Check() {return edit->text().size() > 0;}
private:QLineEdit* edit;
};class Third: public Step
{
public:Third(QWidget *parent = 0):Step(parent){SetText("把顶上3张插到中间任意位置");radio = new QRadioButton("第一张后面",this);radio1 = new QRadioButton("第二张后面",this);radio2 = new QRadioButton("第三张后面",this);radio3 = new QRadioButton("第四张后面",this);GetChooseLayout()->addWidget(radio);GetChooseLayout()->addWidget(radio1);GetChooseLayout()->addWidget(radio2);GetChooseLayout()->addWidget(radio3);radio->setChecked(true);}int GetChoose(){if(radio->isChecked())return 1;if(radio1->isChecked())return 2;if(radio2->isChecked())return 3;if(radio3->isChecked())return 4;return 1;}
private:QRadioButton* radio;QRadioButton* radio1;QRadioButton* radio2;QRadioButton* radio3;
};class Four: public Step
{
public:Four(QWidget *parent = 0):Step(parent){SetText("拿掉顶上的牌放到一边");}
};class Five: public Step
{
public:Five(QWidget *parent = 0):Step(parent){SetText("南方人/北方人/不确定,分别拿顶上的1/2/3张牌插到中间");QVBoxLayout* vbox = new QVBoxLayout;QHBoxLayout* hbox = new QHBoxLayout;QHBoxLayout* hbox1 = new QHBoxLayout;QButtonGroup* group = new QButtonGroup(this);QButtonGroup* group1 = new QButtonGroup(this);radio = new QRadioButton("南方人",this);radio1 = new QRadioButton("北方人",this);radio2 = new QRadioButton("不确定",this);radio3 = new QRadioButton("第一张后面",this);radio4 = new QRadioButton("第二张后面",this);radio5 = new QRadioButton("第三张后面",this);hbox->addWidget(radio);hbox->addWidget(radio1);hbox->addWidget(radio2);hbox1->addWidget(radio3);hbox1->addWidget(radio4);hbox1->addWidget(radio5);group->addButton(radio);group->addButton(radio1);group->addButton(radio2);group1->addButton(radio3);group1->addButton(radio4);group1->addButton(radio5);vbox->addLayout(hbox);vbox->addLayout(hbox1);GetChooseLayout()->addLayout(vbox);radio2->setChecked(true);radio3->setChecked(true);}int GetChoose(){if(radio->isChecked())return 1;else if(radio1->isChecked())return 2;else if(radio2->isChecked())return 3;return 1;}int GetChoose1(){if(radio3->isChecked())return 1;else if(radio4->isChecked())return 2;else if(radio5->isChecked())return 3;return 1;}
private:QRadioButton* radio;QRadioButton* radio1;QRadioButton* radio2;QRadioButton* radio3;QRadioButton* radio4;QRadioButton* radio5;
};class Six: public Step
{
public:Six(QWidget *parent = 0):Step(parent){SetText("男生拿掉1张,女生拿掉2张");radio = new QRadioButton("男生",this);radio1 = new QRadioButton("女生",this);GetChooseLayout()->addWidget(radio);GetChooseLayout()->addWidget(radio1);radio->setChecked(true);}int GetChoose(){if(radio->isChecked())return 1;if(radio1->isChecked())return 2;return 1;}
private:QRadioButton* radio;QRadioButton* radio1;
};class Seven: public Step
{
public:Seven(QWidget *parent = 0):Step(parent){SetText("把最顶上的放到最底下,循环7次");}
};class Last: public Step
{
public:Last(QWidget *parent = 0):Step(parent){SetText("好运留下来");flag = 1;}void Init(){SetText("好运留下来");flag = 1;}void ChangeText(){switch(flag){case 0:flag = 1;SetText("好运留下来");break;case 1:flag = 0;SetText("烦恼都丢掉");break;default:break;}}int GetFlag(){return flag;}private:int flag;
};class Widget : public QSplitter
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();
private:void StartGetData();void FirstStep();void SecondStep();void ThridStep();void FourStep();void FiveStep();void SixStep();void SevenStep();void LastStep();void UpdateData();
protected slots:void OnClicked(bool);
private:std::vector<Brand*> m_vecBrand;QString m_firstCard;QLabel* label;QPushButton* btn;QStackedWidget* m_stackedWidget;bool bOver;
};#endif // WIDGET_H

.cpp

#pragma execution_character_set("utf-8")
#include "widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QSplitter(parent)
{setOrientation(Qt::Vertical);label = new QLabel("qweqwe",this);QWidget* widget = new QWidget(this);m_stackedWidget = new QStackedWidget(this);addWidget(label);addWidget(widget);setStretchFactor(1,2);m_stackedWidget->addWidget(new Start);m_stackedWidget->addWidget(new First);m_stackedWidget->addWidget(new Second);m_stackedWidget->addWidget(new Third);m_stackedWidget->addWidget(new Four);m_stackedWidget->addWidget(new Five);m_stackedWidget->addWidget(new Six);m_stackedWidget->addWidget(new Seven);m_stackedWidget->addWidget(new Last);QHBoxLayout* hbox = new QHBoxLayout;QVBoxLayout* vbox = new QVBoxLayout;btn = new QPushButton("下一步",this);hbox->addStretch();hbox->addWidget(btn);vbox->addWidget(m_stackedWidget);vbox->addLayout(hbox);widget->setLayout(vbox);connect(btn, SIGNAL(clicked(bool)), this, SLOT(OnClicked(bool)));bOver = false;
}Widget::~Widget()
{}void Widget::StartGetData()
{Start* start = (Start*)m_stackedWidget->widget(0);QString str = start->GetStr();for(int i=0; i<str.length(); i++){Brand* brand = new Brand(QString(str[i]));m_vecBrand.push_back(brand);}
}void Widget::FirstStep()
{Start* start = (Start*)m_stackedWidget->widget(0);QString str = start->GetStr();for(int i=0; i<str.length(); i++){Brand* brand = new Brand(QString(str[i]));m_vecBrand.push_back(brand);}
}void Widget::SecondStep()
{Second* second = (Second*)m_stackedWidget->widget(2);int number = second->GetNumber();for(int i=0; i<number; i++){Brand* brand = m_vecBrand[0];m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.push_back(brand);}
}void Widget::ThridStep()
{Third* third = (Third*)m_stackedWidget->widget(3);int number = third->GetChoose();Brand* brand = m_vecBrand[0];Brand* brand1 = m_vecBrand[1];Brand* brand2 = m_vecBrand[2];m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.erase(m_vecBrand.begin());std::vector<Brand*> vecBrand;for(int i=0; i<m_vecBrand.size(); i++){vecBrand.push_back(m_vecBrand[i]);if(number == i + 1){vecBrand.push_back(brand);vecBrand.push_back(brand1);vecBrand.push_back(brand2);}}m_vecBrand = vecBrand;
}void Widget::FourStep()
{m_firstCard = m_vecBrand[0]->GetStr();setWindowTitle("当前选择牌为:"+ m_firstCard);m_vecBrand.erase(m_vecBrand.begin());
}void Widget::FiveStep()
{Five* five = (Five*)m_stackedWidget->widget(5);int number = five->GetChoose();int number1 = five->GetChoose1();std::vector<Brand*> vecBrand;switch (number) {case 1:vecBrand.push_back(m_vecBrand[0]);m_vecBrand.erase(m_vecBrand.begin());break;case 2:vecBrand.push_back(m_vecBrand[0]);vecBrand.push_back(m_vecBrand[1]);m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.erase(m_vecBrand.begin());break;case 3:vecBrand.push_back(m_vecBrand[0]);vecBrand.push_back(m_vecBrand[1]);vecBrand.push_back(m_vecBrand[2]);m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.erase(m_vecBrand.begin());break;default:break;}std::vector<Brand*> vecBrand1;for(int i=0; i<m_vecBrand.size(); i++){vecBrand1.push_back(m_vecBrand[i]);if(number1 == i + 1){vecBrand1.insert(vecBrand1.end(), vecBrand.begin(), vecBrand.end());}}m_vecBrand = vecBrand1;
}void Widget::SixStep()
{Six* six = (Six*)m_stackedWidget->widget(5);int number = six->GetChoose();switch (number) {case 1:m_vecBrand.erase(m_vecBrand.begin());break;case 2:m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.erase(m_vecBrand.begin());break;default:break;}
}void Widget::SevenStep()
{for(int i=0; i<7; i++){Brand* brand = m_vecBrand[0];m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.push_back(brand);}
}void Widget::LastStep()
{Last* last = (Last*)m_stackedWidget->widget(8);int flag = last->GetFlag();switch (flag) {case 0:m_vecBrand.erase(m_vecBrand.begin());break;case 1:Brand* brand = m_vecBrand[0];m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.push_back(brand);break;}last->ChangeText();
}void Widget::UpdateData()
{QString str;for(int i=0; i<m_vecBrand.size(); i++){str+= m_vecBrand[i]->GetStr();}label->setText(str);
}void Widget::OnClicked(bool)
{if(bOver){setWindowTitle("magic");Last* last = (Last*)m_stackedWidget->widget(8);last->Init();bOver = false;btn->setText("下一步");m_stackedWidget->setCurrentIndex(0);return;}Step* step = (Step*)m_stackedWidget->currentWidget();if(!step->Check())return;if(m_vecBrand.size() == 1){m_vecBrand.clear();Last* last = (Last*)m_stackedWidget->widget(8);last->SetText("之前的牌为:"+ m_firstCard+ " 对上否?");bOver = true;btn->setText("重新开始");return;}switch (m_stackedWidget->currentIndex()) {case 0://4张牌StartGetData();break;case 1://对折撕开FirstStep();break;case 2://根据名字字数,把顶上的牌放到下面SecondStep();break;case 3://把顶上3张插到中间任意位置ThridStep();break;case 4://拿掉顶上的牌放到一边FourStep();break;case 5://南方人/北方人/不确定,分别拿顶上的1/2/3张牌插到中间FiveStep();break;case 6://男生拿掉1张,女生拿掉2张SixStep();break;case 7://把最顶上的放到最底下,循环7次SevenStep();break;case 8://好运留下来 烦恼都丢掉LastStep();break;default:break;}UpdateData();if(m_stackedWidget->currentIndex() + 1 < m_stackedWidget->count())m_stackedWidget->setCurrentIndex(m_stackedWidget->currentIndex() + 1);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/691093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14. UE5 RPG使用曲线表格设置回复血量值

之前的文章中&#xff0c;我使用的都是固定的数值来设置血量回复或者蓝量回复&#xff0c;在这篇文章里面&#xff0c;介绍一下使用曲线表格。通过曲线表格我们可以设置多个数值&#xff0c;然后通过去通过修改索引对应的数值去修改回复的血量或者蓝量。 创建曲线表格 首先创…

缓存使用常见思路及问题

缓存是我们用来减少数据库访问的常见操作&#xff0c;里面的一些常见思路及问题这里总结下。下面以redis举例。 使用方式分类&#xff1a; 一&#xff0c;只读缓存。 只读缓存时&#xff0c;会先看redis里有无数据&#xff0c;有则直接返回。没有则走数据库查询一次&#xff…

基于python+django+vue.js开发的停车管理系统

功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 功能包括&#xff1a;车位管理、会员管理、停车场管理、违规管理、用户管理、日志管理、系统信息模块。 源码地址 https://github.com/geeeeeeeek/pytho…

k8s实用命令

查看pod运行在哪个node里面 kubectl get pod -o wide // 查看所有的pod运行在哪个node节点kubectl get pod pod名 -o wide // 查看指定pod运行在哪个node节点查看pod事件 kubectl describe pod <pod-name> 查看pod的详细信息 kubectl get pod <pod 名称> -o…

林浩然与杨凌芸的Java奇遇记:字节流世界的二进制爱情

林浩然与杨凌芸的Java奇遇记&#xff1a;字节流世界的二进制爱情 The Java Adventure of Lin Haoran and Yang Lingyun: Binary Love in the Byte Stream World 在编程宇宙中&#xff0c;有一对程序员CP——林浩然和杨凌芸&#xff0c;他们共同编织着Java王国里那些神秘而又充满…

微服务中4种应对跨库Join的思路

微服务或soa服务化&#xff0c;可以把一个大系统划分为n个小系统&#xff0c;独自运行&#xff0c;就意味者垂直分库&#xff0c;垂直分库就意味者数据层面的查询需跨库查询&#xff0c;应对的解决方案&#xff1a; 1.依赖字段较少&#xff1a;字段冗余 A库中的Tab…

MySQL--SQL解析顺序

前言&#xff1a; 一直是想知道一条SQL语句是怎么被执行的&#xff0c;它执行的顺序是怎样的&#xff0c;然后查看总结各方资料&#xff0c;就有了下面这一篇博文了。 本文将从MySQL总体架构—>查询执行流程—>语句执行顺序来探讨一下其中的知识。 一、MySQL架构总览&a…

Swift Combine 使用从 PassthroughSubject 预定好的发送的事件测试订阅者 从入门到精通二十三

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

MSS与cwnd的关系,rwnd又是什么?

慢启动算法是指数递增的 这种指数增长的方式是慢启动算法的一个核心特点&#xff0c;它确保了TCP连接在开始传输数据时能够快速地探测网络的带宽容量&#xff0c;而又不至于过于激进导致网络拥塞。具体来说&#xff1a; 初始阶段&#xff1a;当TCP连接刚建立时&#xff0c;拥…

ubuntu屏幕小的解决办法

1. 安装vmware tools , 再点自适应客户机 执行里面的vmware-install.pl这个文件 &#xff1a;sudo ./vmware-install.pl 执行不了可以放到家目录&#xff0c;我放在了/home/book 里面 最后点这个自适应客户机 然后我这里点不了是因为我点了控制台视图和拉伸客户机&#xff0c…

机器人仓库搬砖

题目描述 机器人搬砖&#xff0c;一共有N堆砖存放在N个不同的仓库中&#xff0c;第i堆砖中有bricks[i]块砖头&#xff0c;要求在8小时内搬完。机器人每小时能搬砖的数量取决于有多少能量格&#xff0c;机器人一个小时中只能在一个仓库中搬砖&#xff0c;机器人的能量格每小时补…

【Java中23种设计模式-单例模式2--懒汉式2线程安全】

加油&#xff0c;新时代打工人&#xff01; 简单粗暴&#xff0c;学习Java设计模式。 23种设计模式定义介绍 Java中23种设计模式-单例模式 Java中23种设计模式-单例模式2–懒汉式线程不安全 package mode;/*** author wenhao* date 2024/02/19 09:38* description 单例模式…

工具开发-SharpZipAES 用于压缩和加密文件,以缩短传输时间

免责声明&#xff1a;本工具仅供安全研究和教学目的使用&#xff0c;用户须自行承担因使用该工具而引起的一切法律及相关责任。作者概不对任何法律责任承担责任&#xff0c;且保留随时中止、修改或终止本工具的权利。使用者应当遵循当地法律法规&#xff0c;并理解并同意本声明…

鸿蒙开发 之 工具安装和环境搭建

DevEco Studio 面向HarmonyOS应用及元服务开发者提供的集成开发环境(IDE)&#xff0c; 助力高效开发。 ArkTS 语言 ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;对TS的动态类型特性施加更严格的约束&…

Flask 学习99-Flask-SocketIO 快速入门与使用

前言 flask-socketio 为flask应用提供了一个客户端与服务器之间低延迟的双向通讯 官网地址:https://flask-socketio.readthedocs.io/en/latest/intro.html 环境准备 先安装flask-socketio pip install flask-socketio说明Flask-SocketIO 与 js版本客户端不匹配,二者不能正…

机器学习之梯度下降法直观理解

形象化举例&#xff0c;由上图所示&#xff0c;假如最开始&#xff0c;我们在一座大山上的某处位置&#xff0c;因为到处都是陌生的不知道下山的路&#xff0c;所以只能摸索着根据直觉&#xff0c;走一步算一步。在此过程中&#xff0c;每走到一个位置的时候&#xff0c;都会求…

五步解决 Ubuntu 18.04 出现GLIBC_2.28 not found的解决方法

Ubuntu 18.04 出现GLIBC_2.28 not found的解决方法 参考debian网址https://packages.debian.org/buster/并搜索想要的软件或者工具等&#xff0c;如libc6,有结果如下&#xff1a; 具体就不介绍了&#xff0c;请浏览官网了解。 第一步&#xff1a;添加软件源&#xff0c;在/et…

STM32-点亮 LED

目录 1 、电路构成及原理图 2 、编写实现代码 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 本人使用的是朗峰 STM32F103 系列开发板&#xff0c;此笔记基于这款开发板记录。 1 、电路构成及原理图 首先&#xff0c;通过朗峰 F1 开发板 LED 部分原理图看到…

第三十六天| 435. 无重叠区间、763.划分字母区间、56. 合并区间

Leetcode 435. 无重叠区间 题目链接&#xff1a;435 无重叠区间 题干&#xff1a;给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 思考&#xff1a;贪心法。和452 用最少数量的…

Gin框架: HTML模板渲染之配置与语法详解

Gin的HTML模板配置 1 &#xff09;单一目录的配置 配置模板目录&#xff0c;在与main.go同级下, 新建目录&#xff0c;下面二选一&#xff0c;仅作举例, 这里选择 tpls templatestpls 在 tpls 目录下新建 news.html <!-- 最简单的 --> <h1>News Page</h1>&l…