C语言 - 跳舞配对问题
一、任务
一班有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语言 - 跳舞配对问题相关推荐
- java中统计括号配对_括号配对问题(C语言或JAVA语言代码)
描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0 "]", "(", ")" 四种字符 输出 每组输入数 ...
- acm括号配对问题c语言,ACM:UESTC - 649 括号配对问题 - stack
/*/ 简单的括号配对问题 先把给出的数字串全部变成括号串,在用栈去压入括号,每次保存栈顶括号,如果栈顶括号能和下一个括号配对,就把栈顶弹出,指括号的指针后移. 最后判断栈内是否还有元素,如果有,就说 ...
- C语言:IF-ELSE的配对问题
IF-ELSE的配对问题: if else 配对的原则是:else 与最近的 if 配对.
- 1个系统节拍 c语言_一个跳舞机器人的C语言程序
先写预处理命令和变量定义. 编写简谱的数组,其中第一项为音符,第二项为节拍,第三项为小车动作值. 还有定时器中断处理程序,用它来输出方波. 再写一个读简谱子程序,就是把数组中的数据分别放到定时器初值变 ...
- 舞伴配对问题c语言实训报告,C语言数据结构队列实现舞伴匹配(数据结构第二次实验)...
C语言实验作业 题目如下: 课程名称:数据结构 实验目的: 1.掌握队列的定义及实现: 2.掌握利用队列的基本操作. 实验要求: 1. 使用链式结构完成队列的各种基本操作: 2. 补充完善 ...
- 算法设计与分析男女匹配问题C语言,C语言解决新郎和新娘配对问题代码解析
问题描述 有3对情侣结婚,假设2个新郎为A.B.C,3个新娘为X.Y.Z,有参加婚礼的人搞不清谁和谁结婚,所以去询问了这6位新人中的3位,得到的回答如下:新郎A说他要和新娘X结婚:新娘X说她的未婚夫是 ...
- Sine之舞 真的会跳舞哇,c语言实现
问题描述 最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功. 所以他准备和奶牛们做一个"Sine之舞"的游戏,寓教于乐,提高奶牛们的计算能 ...
- 编程实现舞伴问题 c语言,C语言实现舞伴问题(队列)假设在周末舞会上,男士们(m人)和女士们(n人)进入舞厅时,各自排成一队。跳舞开始时,依次从男...
共回答了12个问题采纳率:91.7% #includetypedef struct que{ int *qu; int front,rear; }Squeue; void Initqueue(Sque ...
- C语言13567星号如何输出,c语言程序编程心得
c语言程序设计 本课介绍c语言程序设计的基本方法和基本的程序语句. 从程序流程的角度来看,程序可以分为三种基本结构,即顺序结构.分支结构.循环结构.这三种基本结构可以组成所有的各种复杂程序.c语言提供 ...
最新文章
- 01 http协议概念及工作流程
- 【.NetCore学习】ASP.NET Core EF Core2.0 DB First现有数据库自动生成实体Context
- oracle什么是全局锁,深入浅出oracle锁---原理篇
- 函数调用规范__cdecl和__stdcall的区别
- .NET Core开发实战(第29课:定义仓储:使用EF Core实现仓储层)--学习笔记
- 请问这博客能有几种方便写法?
- QT+VS中ui不能声明为指针?
- Windows中下载并安装RabbitMQ
- java 设置系统参数_Java 设置系统参数和运行参数
- atitit knowmng知识管理 索引part2
- JavaScript高级程序设计(读书笔记)(七)
- 权重的计算(变异系数法)
- 宁波大学2014年数学分析考研试题
- unity中单位是米还是厘米_厘米和米都是什么单位
- 我怎样学会英语的--钟道隆逆向英语学习法1
- python 基于CQL操作neo4j数据库
- c盘空间不足的一些删除办法
- FPGA Verilog HDL 系列实例--------顺序脉冲发生器
- python中selenium(模拟登陆)+pytesseract(自动识别验证码)应用例子之查询住房公积金
- IE、MIcrosoft Edge无法上网,但其他浏览器可以上网 —— 解决方案