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.rhkb.cn/news/260950.html

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

相关文章

离线升级esp32开发板升级包esp32-2.0.14(最新版已经3.0alpha了)

1.Arduino IDE 2.3.2最新 2024.2.20升级安装:https://www.arduino.cc/en/software 2.开发板地址 地址&#xff08;esp8266,esp32&#xff09; http://arduino.esp8266.com/stable/package_esp8266com_index.json,https://raw.githubusercontent.com/espressif/arduino-esp32…

09MARL深度强化学习policy gradient

文章目录 前言1、Multi-Agent Policy Gradient Theorem2、Centralised State-Value Critics2、Centralised Action-Value Critics 前言 Independent learning算法当中每个智能体看待其他智能体为环境的一部分&#xff0c;加剧了环境非平稳性&#xff0c;而CTDE框架的算法能够降…

HTTP的详细介绍

目录 一、HTTP 相关概念 二、HTTP请求访问的完整过程 1、 建立连接 2、 接收请求 3、 处理请求 3.1 常见的HTTP方法 3.2 GET和POST比较 4、访问资源 5、构建响应报文 6、发送响应报文 7、记录日志 三、HTTP安装组成 1、常见http 服务器程序 2、apache介绍和特点 …

工具分享:在线键盘测试工具

在数字化时代&#xff0c;键盘作为我们与计算机交互的重要媒介之一&#xff0c;其性能和稳定性直接影响到我们的工作效率和使用体验。为了确保键盘的每个按键都能正常工作&#xff0c;并帮助用户检测潜在的延迟、连点等问题&#xff0c;一款优质的在线键盘测试工具显得尤为重要…

QT设置窗口随窗体变化(窗口文本框随窗体的伸缩)

目录 1.建立新窗口2.最终效果 1.建立新窗口 1&#xff09;在窗体中创建一个 textBrowser&#xff0c;记录坐标及宽高 X-100 Y-130 宽-571 高-281&#xff0c;窗体宽高800*600&#xff1b; 2&#xff09;在.h头文件中插入void resizeEvent(QResizeEvent *event) override;函数 …

如何系统地自学Python?

如何系统地自学Python&#xff1f; 如何系统地自学Python&#xff1f;1.了解编程基础2.学习Python基础语法3.学习Python库和框架4.练习编写代码5.参与开源项目6.加入Python社区7.利用资源学习8.制定学习计划9.持之以恒总结 如何系统地自学Python&#xff1f; 作为一个Python语…

【MySQL】如何处理DB读写分离数据不一致问题?

文章内容 1、前言读写库数据不一致问题我们如何解决&#xff1f;方案一&#xff1a;利用数据库自身特性方案二&#xff1a;不解决方案三&#xff1a;客户端保存法方案四&#xff1a;缓存标记法方案五&#xff1a;本地缓存标记 那DB读写分离情况下&#xff0c;如何解决缓存和数据…

h5网页和 Android APP联调,webview嵌入网页,网页中window.open打开新页面,网页只在webview中打开,没有重开一个app窗口

我是h5网页开发&#xff0c;客户app通过webview嵌入我的页面 点击标题window.open跳转到长图页面&#xff0c;客户的需求是在app里新开一个窗口展示长图页面&#xff0c;window.open打开&#xff0c;ios端是符合客户需求的&#xff0c;但是在安卓端他会在当前webview打开 这…

Find My资讯|苹果Vision Pro无法通过Find My进行远程定位和发声

苹果 Vision Pro 头显现在已经正式开售&#xff0c;不过根据该公司日前发布的支持文件&#xff0c;这款头显目前缺乏一系列关键查找功能&#xff0c;用户无法在 iCloud 网站或Find My应用中获悉头显的位置&#xff0c;也无法让这款头显远程播放声音。 不过支持文件同时提到 V…

3、windows环境下vscode开发c/c++环境配置(二)

前言&#xff1a;上一篇文章写了windows环境下&#xff0c;配置vscode的c/c开发环境&#xff0c;这一篇讲vscode开发c/c的配置文件&#xff0c;包括c_cpp_propertues.json&#xff0c;task.json及launch.json。 一、总体流程 通过c/c插件我们就可以来编写c/c程序了&#xff0c…

新版AI系统ChatGPT源码支持GPT-4/支持AI绘画去授权

源码获取方式 搜一搜&#xff1a;万能工具箱合集 点击资源库直接进去获取源码即可 如果没看到就是待更新&#xff0c;会陆续更新上 新版AI系统ChatGPT网站源码支持GPT-4/支持AI绘画/Prompt应用/MJ绘画源码/PCH5端/免授权&#xff0c;支持关联上下文&#xff0c;意间绘画模型…

村级数据下载

简介 我开发了一个网站&#xff0c;是一个提供2010年-2023年的中国行政区划关系的查询网站&#xff0c;github开源地址为&#xff1a;https://github.com/ruiduobao/gaode_MAP_CUN&#xff0c;五级行政区划的上下级关系来源于统计局发布的各个年份对应的统计用区划代码和城乡划…

Android 基础技术——Framework

笔者希望做一个系列&#xff0c;整理 Android 基础技术&#xff0c;本章是关于 Framework 简述 Android 系统启动流程 当按电源键触发开机&#xff0c;首先会从 ROM 中预定义的地方加载引导程序 BootLoader 到 RAM 中&#xff0c;并执行 BootLoader 程序启动 Linux Kernel&…

已解决Application run failed org.springframework.beans.factory.BeanNot

问题原因&#xff1a;SpringBoot的版本与mybiats-puls版本不对应且&#xff0c;spring自带的mybiats与mybiats-puls版本不对应 这里我用的是3.2.2版本的SpringBoot&#xff0c;之前mybiats-puls版本是3.5.3.1有所不同。 问题&#xff1a;版本对不上 解决办法&#xff1a;完整…

NoSQL 数据库管理工具,搭载强大支持:Redis、Memcached、SSDB、LevelDB、RocksDB,为您的数据存储提供无与伦比的灵活性与性能!

NoSQL 数据库管理工具&#xff0c;搭载强大支持&#xff1a;Redis、Memcached、SSDB、LevelDB、RocksDB&#xff0c;为您的数据存储提供无与伦比的灵活性与性能&#xff01; 【官网地址】&#xff1a;http://www.redisant.cn/nosql 介绍 直观的用户界面 从单一应用程序中同…

计算机视觉基础:【矩阵】矩阵选取子集

OpenCV的基础是处理图像&#xff0c;而图像的基础是矩阵。 因此&#xff0c;如何使用好矩阵是非常关键的。 下面我们通过一个具体的实例来展示如何通过Python和OpenCV对矩阵进行操作&#xff0c;从而更好地实现对图像的处理。 示例 示例&#xff1a;选取矩阵中指定的行和列的…

我为什么不喜欢关电脑?

程序员为什么不喜欢关电脑&#xff1f; 你是否注意到&#xff0c;程序员们似乎从不关电脑&#xff1f;别以为他们是电脑上瘾&#xff0c;实则是有他们自己的原因&#xff01;让我们一起揭秘背后的原因&#xff0c;看看程序员们真正的“英雄”本色&#xff01; 一、上大学时。 …

C++:C++入门基础

创作不易&#xff0c;感谢三连 &#xff01;&#xff01; 一、什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff…

0220作业

C语言实现LED1闪烁 led.h #ifndef __LED_H__ #define __LED_H__//RCC寄存器封装 #define RCC_MP_AHB4_ENSETR (*(volatile unsigned int*)0x50000A28) //寄存器封装//GPIO寄存器封装 typedef struct{volatile unsigned int MODER; //00volatile unsigned int OTYPER; //04vol…

代码随想录算法训练营DAY21 | 二叉树 (9)

一、LeetCode 669 修建二叉搜索树 题目链接&#xff1a;669.修建二叉搜索树https://leetcode.cn/problems/trim-a-binary-search-tree/description/ 思路&#xff1a;递归三部曲-定参数、返回值-定终止条件-定单层递归逻辑 class Solution {public TreeNode trimBST(TreeNode …