一、任务

一班有m个女生,有n个男生(m不等于n),现要开一个舞会。男女生分别编号坐在舞池的两边的椅子上,每曲开始时,依次从男生和女生中各出一人配对跳舞, 本曲没成功配对者坐着等待下一曲找舞伴。配对成功的舞伴跳完舞后排回各自队伍的最后。

请设计一系统模拟动态地显示出上述过程,要求输出计算任何一个女生(编号为X)和任意男生(编号为Y)第一次配对跳舞的舞曲编号K。

输入什么数据,会出现100支舞曲内X和Y都不能成功配对跳舞的情况?尝试一下。

二、程序分析

1.男生和女生依次排队,排在对头的男生和排在对头的女生先配对,舞曲结束排到各自的队尾。因此该问题具体有典型的先进先出特性,可用队列作为数据的存储方式。

2.算法需要两个队列,分别是存放男生队列和女生队列,每跳一支舞曲则是一次男女队列的出队列和入队列。

3.初始化时男生、女生队列的值分别为他们的编号序列。

4.解决该问题的方法与实验5类似,将每次配对的女生和男生编号与指定编号比较,相等则目前该舞曲是需要计算的舞曲。注意舞曲的数目必须限制在一定的范围内,避免死循环。例如在100支舞曲内,X和Y都没有配对跳舞,则输出不可能配对成功。

三、调试测试

1.输入:按提示输入女生和男生的人数,以及希望配对跳舞的女生编号和男生编号。    6,9或者4,7

2.输出:X女生和Y男生配对跳舞成功,并且输出当前X和Y首次配对跳舞的舞曲序号K。  4,7第16首歌曲

四、程序

1、

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 //#include<process.h>
  4 #define MAX 100    //max指的是队列的最大长度
  5 typedef int DataType;
  6 typedef struct
  7
  8 {
  9
 10     DataType elem[MAX];/* 定义数组依次存放队列里的数据元素  */
 11     int   front ;      /*指向队头元素的下标*/
 12     int   rear;         /* 指向队尾元素的下一个空位  */
 13
 14 } Queue;
 15
 16 Queue InitQueue();
 17 //初始化并返回一个空队列
 18 void ClearQueue(Queue Q);
 19 //清空队列Q中的元素
 20 int IsEmpty(Queue Q);
 21 //判断队列是否为空,返回队列或非空标志
 22 int Isfull(Queue Q);
 23 //判断是否为满,返回队列满或不满标志
 24 Queue InserQ(Queue Q,DataType x);
 25 //若队列未满,将数据元素x进队列
 26 Queue DeleteQ(Queue Q);
 27 //若队列非空,删除对头元素
 28 DataType GetHead(Queue Q);
 29 //若队列非空,返回队列Q中的对头元素
 30 DataType GetRear(Queue Q);
 31 //若队列非空,返回队列Q中的队尾元素
 32
 33
 34
 35
 36
 37
 38
 39 main()
 40 {
 41
 42     int m,n,song;
 43     int i,j,k,x1,x2,v1,v2;
 44     Queue Q1,Q2;
 45     printf("Input count of girls :");
 46     scanf("%d",&m);
 47     printf("Input count of boys :");
 48     scanf("%d",&n);
 49     printf("Input the songs number :");
 50     scanf("%d",&song);
 51
 52     if (m==n||n<0||m<0)
 53     {
 54         printf("m==n||n<0||m<0 input again!\n");
 55         printf("Input count of girls :");
 56         scanf("%d",&m);
 57         printf("Input count of boys :");
 58         scanf("%d",&n);
 59     }
 60
 61     Q1=InitQueue();
 62     Q2=InitQueue();
 63
 64     for(i=1; i<=m; i++)
 65     {
 66         Q1=InserQ(Q1,i);
 67
 68     }
 69
 70     for(j=1; j<=n; j++)
 71     {
 72         Q2=InserQ(Q2,j);
 73
 74     }
 75
 76     v1=v2=0;
 77     for(k=1; k<song; k++)
 78     {
 79
 80         x1=GetHead(Q1);
 81         v1=x1;
 82         x2=GetHead(Q2);
 83         v2=x2;
 84         Q1=DeleteQ(Q1);
 85         Q2=DeleteQ(Q2);
 86         Q1=InserQ(Q1,v1);
 87         Q2=InserQ(Q2,v2);
 88
 89     }
 90
 91     printf("Result:This is %d's girls and %d's boy dance!",GetHead(Q1),GetHead(Q2));
 92
 93 }
 94
 95 Queue InitQueue()
 96 {
 97     Queue Q;
 98     Q.front=Q.rear=0;  //队列初始化Q.front=Q.rear=0
 99     return(Q);
100 }
101
102 Queue InserQ(Queue Q,DataType x)  //若队列未满,将数据元素x进队
103 {
104     if ((Q.rear+1) % MAX== Q.front)
105         printf("队列已满,无法进队");
106     else
107     {
108         Q.elem[Q.rear]=x;  //x进队列
109         Q.rear = (Q.rear+1) % MAX;  //rear指向队尾下一个空位
110     }
111     return(Q);
112 }
113
114 Queue DeleteQ(Queue Q)   //若队列非空,删除对头元素
115 {
116     if (Q.rear ==Q.front)
117         printf("队列是空,无法出队!");
118     else
119         Q.front=(Q.front+1) % MAX;
120     return(Q);
121 }
122
123 DataType GetHead(Queue Q)  //若队列非空,去对头元素赋值给x
124 {
125     int x;
126     if(Q.rear == Q.front)
127         printf("队列是空的,无法取队头!");
128     else
129         x=Q.elem[Q.front];
130     return(x);
131
132 }

View Code

2、

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #define MAX 100
  4    //max指的是队列的最大长度
  5 typedef int DataType;
  6 typedef struct
  7 {
  8
  9     DataType elem[MAX];/* 定义数组依次存放队列里的数据元素  */
 10     int   front ;      /*指向队头元素的下标*/
 11     int   rear;         /* 指向队尾元素的下一个空位  */
 12
 13 } Queue;
 14
 15 Queue InitQueue();
 16 //初始化并返回一个空队列
 17 void ClearQueue(Queue Q);
 18 //清空队列Q中的元素
 19 int IsEmpty(Queue Q);
 20 //判断队列是否为空,返回队列或非空标志
 21 int Isfull(Queue Q);
 22 //判断是否为满,返回队列满或不满标志
 23 Queue InserQ(Queue Q,DataType x);
 24 //若队列未满,将数据元素x进队列
 25 Queue DeleteQ(Queue Q);
 26 //若队列非空,删除对头元素
 27 DataType GetHead(Queue Q);
 28 //若队列非空,返回队列Q中的对头元素
 29 DataType GetRear(Queue Q);
 30 //若队列非空,返回队列Q中的队尾元素
 31
 32 main()
 33 {
 34
 35     int m,n,song;
 36     int i,j,k,x,y,x1,x2,v1,v2;
 37     Queue Q1,Q2;
 38     printf("Input count of girls :");
 39     scanf("%d",&m);
 40     printf("Input count of boys :");
 41     scanf("%d",&n);
 42     if (m==n||n<0||m<0)
 43     {
 44         printf("m==n||n<0||m<0 input again!\n");
 45         printf("Input count of girls :");
 46         scanf("%d",&m);
 47         printf("Input count of boys :");
 48         scanf("%d",&n);
 49     }
 50
 51     Q1=InitQueue();
 52     Q2=InitQueue();
 53
 54     for(i=1; i<=m; i++)
 55     {
 56         Q1=InserQ(Q1,i);         //对队列Q1进行赋值
 57
 58     }
 59
 60     for(j=1; j<=n; j++)
 61     {
 62         Q2=InserQ(Q2,j);               ////对队列Q2进行赋值
 63
 64     }
 65
 66 printf("Input number of girls :");
 67     scanf("%d",&x);
 68     printf("Input number of boys :");
 69     scanf("%d",&y);
 70
 71     if (x>m||y>n)
 72     {
 73         printf("x>m||y>n input again!\n");
 74         printf("Input number of girls :");
 75         scanf("%d",&x);
 76         printf("Input number of boys :");
 77         scanf("%d",&y);
 78     }
 79
 80     song=1;
 81
 82     do
 83     {
 84         v1=v2=0;
 85         x1=GetHead(Q1);              //取队头Q1
 86         v1=x1;
 87         x2=GetHead(Q2);          //取队头Q2
 88         v2=x2;
 89         Q1=DeleteQ(Q1);           //删除队头Q1
 90         Q2=DeleteQ(Q2);           //删除队头Q2
 91         Q1=InserQ(Q1,v1);          //返回 队尾Q1
 92         Q2=InserQ(Q2,v2);           //返回 队尾Q2
 93         song++;
 94     }
 95     while(GetHead(Q1)!=x||GetHead(Q2)!=y);
 96     printf("Result:This is %d's girls and %d's boy dance!song's number:%d",x,y,song);
 97
 98 }
 99
100 Queue InitQueue()
101 {
102     Queue Q;
103     Q.front=Q.rear=0;  //队列初始化Q.front=Q.rear=0
104     return(Q);
105 }
106
107 Queue InserQ(Queue Q,DataType x)  //若队列未满,将数据元素x进队
108 {
109     if ((Q.rear+1) % MAX== Q.front)
110         printf("队列已满,无法进队");
111     else
112     {
113         Q.elem[Q.rear]=x;  //x进队列
114         Q.rear = (Q.rear+1) % MAX;  //rear指向队尾下一个空位
115     }
116     return(Q);
117 }
118
119 Queue DeleteQ(Queue Q)   //若队列非空,删除对头元素
120 {
121     if (Q.rear ==Q.front)
122         printf("队列是空,无法出队!");
123     else
124         Q.front=(Q.front+1) % MAX;
125     return(Q);
126 }
127
128 DataType GetHead(Queue Q)  //若队列非空,去对头元素赋值给x
129 {
130     int x;
131     if(Q.rear == Q.front)
132         printf("队列是空的,无法取队头!");
133     else
134         x=Q.elem[Q.front];
135     return(x);
136
137 }

View Code

转载于:https://www.cnblogs.com/momoshengxiao/p/4915650.html

C语言 - 跳舞配对问题相关推荐

  1. java中统计括号配对_括号配对问题(C语言或JAVA语言代码)

    描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0 "]", "(", ")" 四种字符 输出 每组输入数 ...

  2. acm括号配对问题c语言,ACM:UESTC - 649 括号配对问题 - stack

    /*/ 简单的括号配对问题 先把给出的数字串全部变成括号串,在用栈去压入括号,每次保存栈顶括号,如果栈顶括号能和下一个括号配对,就把栈顶弹出,指括号的指针后移. 最后判断栈内是否还有元素,如果有,就说 ...

  3. C语言:IF-ELSE的配对问题

    IF-ELSE的配对问题: if else 配对的原则是:else 与最近的 if 配对.

  4. 1个系统节拍 c语言_一个跳舞机器人的C语言程序

    先写预处理命令和变量定义. 编写简谱的数组,其中第一项为音符,第二项为节拍,第三项为小车动作值. 还有定时器中断处理程序,用它来输出方波. 再写一个读简谱子程序,就是把数组中的数据分别放到定时器初值变 ...

  5. 舞伴配对问题c语言实训报告,C语言数据结构队列实现舞伴匹配(数据结构第二次实验)...

    C语言实验作业 题目如下: 课程名称:数据结构 实验目的: 1.掌握队列的定义及实现: 2.掌握利用队列的基本操作. 实验要求: 1.    使用链式结构完成队列的各种基本操作: 2.    补充完善 ...

  6. 算法设计与分析男女匹配问题C语言,C语言解决新郎和新娘配对问题代码解析

    问题描述 有3对情侣结婚,假设2个新郎为A.B.C,3个新娘为X.Y.Z,有参加婚礼的人搞不清谁和谁结婚,所以去询问了这6位新人中的3位,得到的回答如下:新郎A说他要和新娘X结婚:新娘X说她的未婚夫是 ...

  7. Sine之舞 真的会跳舞哇,c语言实现

    问题描述 最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功. 所以他准备和奶牛们做一个"Sine之舞"的游戏,寓教于乐,提高奶牛们的计算能 ...

  8. 编程实现舞伴问题 c语言,C语言实现舞伴问题(队列)假设在周末舞会上,男士们(m人)和女士们(n人)进入舞厅时,各自排成一队。跳舞开始时,依次从男...

    共回答了12个问题采纳率:91.7% #includetypedef struct que{ int *qu; int front,rear; }Squeue; void Initqueue(Sque ...

  9. C语言13567星号如何输出,c语言程序编程心得

    c语言程序设计 本课介绍c语言程序设计的基本方法和基本的程序语句. 从程序流程的角度来看,程序可以分为三种基本结构,即顺序结构.分支结构.循环结构.这三种基本结构可以组成所有的各种复杂程序.c语言提供 ...

最新文章

  1. 01 http协议概念及工作流程
  2. 【.NetCore学习】ASP.NET Core EF Core2.0 DB First现有数据库自动生成实体Context
  3. oracle什么是全局锁,深入浅出oracle锁---原理篇
  4. 函数调用规范__cdecl和__stdcall的区别
  5. .NET Core开发实战(第29课:定义仓储:使用EF Core实现仓储层)--学习笔记
  6. 请问这博客能有几种方便写法?
  7. QT+VS中ui不能声明为指针?
  8. Windows中下载并安装RabbitMQ
  9. java 设置系统参数_Java 设置系统参数和运行参数
  10. atitit knowmng知识管理 索引part2
  11. JavaScript高级程序设计(读书笔记)(七)
  12. 权重的计算(变异系数法)
  13. 宁波大学2014年数学分析考研试题
  14. unity中单位是米还是厘米_厘米和米都是什么单位
  15. 我怎样学会英语的--钟道隆逆向英语学习法1
  16. python 基于CQL操作neo4j数据库
  17. c盘空间不足的一些删除办法
  18. FPGA Verilog HDL 系列实例--------顺序脉冲发生器
  19. python中selenium(模拟登陆)+pytesseract(自动识别验证码)应用例子之查询住房公积金
  20. IE、MIcrosoft Edge无法上网,但其他浏览器可以上网 —— 解决方案

热门文章

  1. 【TV Picture Quality - 01】TV背景知识
  2. 黑客教父详解账号泄露全过程
  3. 企业IT、OT与CT的融合,加快数字化制造转型
  4. jvm 之 国际酒店 8 月 19 一次full GC 导致的事故
  5. 计算机R5,IT教程:电脑r5和r7是什么意思
  6. 关于PaddlePaddle环境安装的注意事项
  7. ubuntu下彻底卸载 jupyter notebook
  8. Python入门笔记,看完直接玩几个小案例是没有问题滴~
  9. 单片机C语言C51的输入输出
  10. 企业基本财务指标计算