有M个敢死队员要炸掉敌人的一碉堡,谁都不想去,排长决定用轮回数数的办法来决定哪个战士去执行任务。如果前一个战士没完成任务,则要再派一个战士上去。现给每个战士编一个号,大家围坐成一圈,随便从某一个战士开始计数,当数到5时,对应的战士就去执行任务,且此战士不再参加下一轮计数。如果此战士没完成任务,再从下一个战士开始数数,被数到第5时,此战士接着去执行任务。以此类推,直到任务完成为止。

排长是不愿意去的,假设排长为1号,请你设计一程序,求出从第几号战士开始计数才能让排长最后一个留下来而不去执行任务。

要求:至少采用三种不同的数据结构的方法实现。

1.数组方法

#include<stdio.h>
struct some{
    int num;};
    
void search(int *b,int M){
    int i,j=0,p=0;
    while(M-p>1){
       for(i=0;i<M;i++)  
        if(*(b+i)!=0){
            j++;
            if(j%5==0){
            p++;  
            *(b+i)=0;}
        }  
    }
    for(i=0;i<M;i++)     
    if(*(b+i)!=0){
        int a=*(b+i);
        int b=M-a+2;
            printf("从第%d个人开始计数",b%M);}
}
int main(){
    int M,i,q=1;
    struct some a[100]; 
    printf("请输入战士人数M:");
    scanf("%d",&M);
    for(i=0;i<M;i++,q++)
    a[i].num=q;
    search(&a[0].num,M);
    return 0; 
}
2.循环单链表

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node{
    int data;
    struct node *next ;
}LNode;

LNode *Creat(int n){
    LNode *s,*q,*T;
    int i;
    if(n!=0){
        T=q=(LNode *)malloc(sizeof(LNode));
        q->data=1;
        for(i=2;i<=n;i++){
            s=(LNode*)malloc(sizeof(LNode));
            q->next=s;
            q->next->data=i;
            q=q->next;
        }    
        q->next=T;
    }
    return T;}

Delete (LNode *T){ 
    LNode *a;
    int i;
    while(T->next!=T){
        for(i=1;i<4;i++)
            T=T->next;
        a=T->next;
        T->next=a->next;
        free(a);
        T=T->next ;
    }
    printf("\n");
    return (T->data );
}

int main(){
    int s,i,count=0;
    LNode *p;
    int z ,y,e=1,c=1,M;
        printf("请输入敢死队的人数:");
        scanf("%d",&M);
        if(M<1){
            printf("输入有误重新输入\n1");
        }
            else{
            p=Creat(M);
            y=Delete(p);
            z=M-y+2;
            if(z%M==0)
                printf("从第%d号开始计数\n",z);
            else
                printf("从第%d号开始计数\n",(M-y+2)%M);}}
3.循环队列

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define QueueSize 1000
typedef struct{
    int data[QueueSize];
    int front;
    int rear;
    int count; 
}SqQueue;

void Initial(SqQueue *Q)
{
    Q->front=Q->rear=0;
    Q->count=0;
}

int IsEmpty(SqQueue *Q)
{
    return Q->front==Q->rear;
}

int Full(SqQueue *Q)
{
    return Q->rear==QueueSize-1+Q->front;
}

void EnQueue(SqQueue *Q,int x)
{
    if (Full(Q))
    {
        printf("队列上溢"); 
    }
    Q->data[Q->rear]=x; 
    Q->rear=(Q->rear+1)%QueueSize; 
    Q->count ++; 
}

int DeQueue(SqQueue *Q)
{
    int t;
    if(IsEmpty(Q))
    {
        printf("队列为空"); 
    }
    t=Q->data[Q->front];
    Q->front=(Q->front+1)%QueueSize; 
    Q->count--; 
    return t;
}

int main()
{
    int i,count=0,z,y,e=1,c=1,M,a,j;
    SqQueue s;
        printf("请输入敢死队的人数 :");
        scanf("%d",&M);
        for(a=1;a<=M;a++)
            {
                Initial(&s);
                for(i=1;i<=M;i++)
                {
                    EnQueue(&s,i);
                }
                for(i=1;i<a;i++)
                {
                    j=DeQueue(&s);
                    EnQueue(&s,j);
                }
                count=1;
                while(count<M)
                {
                    for(i=1;i<5;i++)
                    {
                        j=DeQueue(&s);
                        EnQueue(&s,j);
                    }
                j=DeQueue(&s);
                count++;
                }
                if(s.data[s.front]==1)
                    break;
            }
            printf("从第%d号开始计数能让排长最后一个留下。",a);
}
4。三合一版本

#include<stdio.h>
#include<stdlib.h>

//敢死队员结构体
struct person{
    int flag;//0表示去执行任务
};

int array() {
    int M, i;
    struct person persons[100];//敢死队员数组,敢死队员编号为数组下标加1
    printf("请输入敢死队人数: ");
    scanf("%d", &M);
    for (i = 0; i < M; i++){
        persons[i].flag = 1;
    }

int cur=0;//当前去执行任务的人数
    int count=0;//计数

//假设从1号开始计数
    for (i = 0; cur<M-1; i++) {
        //从头开始计数
        if(i==M){
            i=0;
        }
        //如果当前队员没有去执行任务
        if(persons[i].flag==1){
            count++;
            //每次计数5次,令当前队员去执行任务
            if(count%5==0){
                cur++;
                persons[i].flag=0;
            }
        }
    }
    int result=0;
    //数组中只剩下一人没去执行任务
    for (i = 0; i < M; i++){
        if(persons[i].flag==1){
            result -= i;
            if(result<0){
                result += M;
            }
            break;
        }
    }
    printf("从第%d个人开始计数",result+1);
    return 0;
}

//链表节点表示队员
 struct node {
    int data;//队员编号
    struct node *next;//指向下一个编号队员
};

//假设从1号开始计数,返回最后一个留下的队员编号
int fun(node *head, int M) {
    node *temp;
    int count;//计数
    int cur=0;//当前执行任务人数
    while (cur < M - 1) {
        for (count = 1; count < 4; count++)
            head = head->next;
        cur++;
        //删除当前节点
        temp = head->next;
        head->next = temp->next;
        free(temp);
        head = head->next;
    }
    return head->data;
}

int cycle_single_list() {
    node *head;//链表头结点
    int M;
    printf("请输入敢死队的人数:");
    scanf("%d", &M);

//创建链表
    node *newNode, *pre;
    int i;
    head = pre = (node *) malloc(sizeof(node));
    pre->data = 1;
    for (i = 2; i <= M; i++) {
        newNode = (node *) malloc(sizeof(node));
        pre->next = newNode;
        pre->next->data = i;
        pre = pre->next;
    }
    pre->next = head;
    int id = fun(head, M);
    int result = 1 - (id - 1);
    if(result<1){
        result+=M;
    }
    printf("从第%d号开始计数",result);
}

//队列
typedef struct {
    int array[1000];//循环队列数组
    int size;//循环队列大小
    int front;//循环队列头部位置
    int back;//循环队列尾部位置
} queue;

//入队
void push(queue *a, int data) {
    a->array[a->back] = data;
    a->back = (a->back + 1) % 1000;
    a->size++;
}

//获取队首元素
int front(queue *a){
    return a->array[a->front];
}

//出队
void pop(queue *a) {
    a->front = (a->front + 1) % 1000;
    a->size--;
}

//假设从1号开始计数,返回最后一个留下的队员编号
int fun(queue *a) {
    int count;//计数
    while (a->size>1){
        for (count = 0; count < 4; count++) {
            int first= front(a);
            pop(a);
            push(a,first);
        }
        pop(a);
    }
    return front(a);
}

int cycle_queue() {
    int M;
    queue q;
    printf("请输入敢死队的人数 :");
    scanf("%d", &M);
    //初始化队列
    q.front=q.back=q.size=0;
    //创建队列
    int i;
    for (i = 0; i < M; i++) {
        push(&q,i+1);
    }
    int id = fun(&q);
    int result = 1 - (id - 1);
    if(result<1){
        result+=M;
    }
    printf("从第%d号开始计数",result);
}

int main() {
    int num;
    while (1) {
        printf("1.数组实现\n");
        printf("2.循环单链表实现\n");
        printf("3.循环队列实现\n");
        scanf("%d", &num);
        if (num == 0) {
            printf("输入错误,请重试\n");
        } else if(num == 1) {
            return array();
        } else if(num == 2) {
            return cycle_single_list();
        } else if(num == 3) {
            return cycle_queue();
        }
    }

}

c++敢死队问题代码(为大一而生)相关推荐

  1. 获取clientheight为0_用10行python代码获取全国城市交通生活圈

    今天在网上冲浪看到一个很花哨的数据,全国各城市主要商圈从早上6点到晚上10点的20min,30min,45min,60min,90min生活圈轮廓. 1 获取思路 按下F12 按下F12,点击淮海路可 ...

  2. 90行代码!大一学生自学编程,自创搜题网站,已在GitHub开源

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 大数据文摘出品 作者:Caleb 考试早已不是学生的"特权"了. ...

  3. 大一计算机生的生涯探索感悟和日记

    个人背景信息:出生于江苏二线北方城市,大学南京师范大学(普通211)计算机本科大一新生.对游戏开发/Unity和软件开发比较感兴趣.成绩中上,绩点4.0,专业7/115. 前言(废话): 清明假第一天 ...

  4. linux c/c++ 代码使用 doxygen 自动生成文档

    www.doxygen.org 的使用非常方便,下面分成2步介绍一下 1. 注释风格,需要在c/c++代码中按照下面的风格添加注释,基本上还是很顺手的 C++的注释风格 主要使用下面这种样式:即在注释 ...

  5. 药学要学python吗_大一医学生有无必要学Python?

    首先我要说 学习一门技术 绝对是百利而无一害的 除非你本人对这项技术完全没有天赋 那我建议也最好别学 你问这个问题 无非是基于一个"医学生"的角度向大家提问 我是个医学生 我有必要 ...

  6. 蓝湖导出android代码,蓝湖一键生成整页代码,帮开发留住头发

    原标题:蓝湖一键生成整页代码,帮开发留住头发 蓝湖 Sketch 插件更新啦!此次更新优化了插件的上传速度,还有配套惊喜功能[一键生成整页代码]上线! 设计师更新 Sketch 插件后,上传移动端设计 ...

  7. 如何写出让人抓狂的代码?

    前言 今天跟大家聊一个有趣的话题:如何写出让人抓狂的代码? 大家看到这个标题,第一印象觉得这篇文章可能是一篇水文.但我很负责的告诉你,它是一篇有很多干货的技术文. 曾几何时,你在阅读别人代码的时候,有 ...

  8. IJCAI 2022 | 用一行代码大幅提升零样本学习方法效果!南京理工牛津提出即插即用分类器模块...

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 点击进入-> CV 微信技术交流群 转载自:机器之心  |  作者:陈督兵 来自南京理工大学和牛津大学 ...

  9. 生信笔记 | 探索PubMed数据库文献

    第一个问题:研究最热门的基因是什么 在NCBI的ftp里面关于人的一些基因信息, 在 :ftp://ftp.ncbi.nlm.nih.gov//gene 下载即可! 其中 gene2pubmed.gz ...

最新文章

  1. [导入]DotNet软件开发框架
  2. win2012双网卡做路由
  3. 前端学习(1681):前端系列实战课程之让蛇动起来
  4. 静物摄影用光技巧_摄影技巧:摄影如何用光?摄影大师总结的10点,非常受用!...
  5. spark学习-Spark的mapPartitions与MapPartitionsWithIndex理解
  6. 安装DotNetCore.1.0.0-VS2015Tools.Preview2.exe 错误Error 0x81f40001 解决方法
  7. php cms选择,php cms 选择哪个好?
  8. 【map知识点总结】
  9. C++数据类型之结构体的练习(用到结构体的赋值,利用结构体元素排序以及查找)
  10. mysql 在线优化工具_MySQL SQL查询优化工具EverSQL
  11. stata面板数据:xtserial下载问题解决
  12. 在VirtualBox的虚拟机上安装和使用NCS2(intel movidius stick 2)
  13. 8086微型计算机第五章接口,微机原理与接口技术课程论文.doc
  14. iPhone开发逻辑分辨率
  15. 荷兰国旗问题python_关于荷的诗句大全
  16. SurfaceView使用日记(二)--实例:绘画板
  17. 视频教程-德国Vue.js2终极开发教程(含Vue路由和Vuex)-Vue
  18. 计算机三级的英语单词,大学英语三级词汇表(新版)资料.doc
  19. 缺一位身份证号码时识别计算
  20. 团队评分标准和评分结果

热门文章

  1. java graphics2d 乱码_Graphics2D 中文乱码
  2. Echarts 学习系列(3)-Echarts动态数据交互
  3. 5214页PDF的进阶架构师学习笔记,阿里巴巴内部Jetpack宝典意外流出
  4. 程序员为什么要学算法?
  5. leecode第一百七十四题(地下城游戏)
  6. ubuntu20.04 磁盘管理
  7. JS判断当前页面是在 QQ客户端/微信客户端/iOS浏览器/Android浏览器/PC客户端
  8. pythonturtle画丘比特之箭_python 使用 turtle 画双心(丘比特之箭)
  9. gitea 手动编译过程,以及踩坑记录
  10. 基于WIZ811MJ的Arduino网络恒温器