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 }

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 }

时间: 2024-10-21 12:24:10

C语言 - 跳舞配对问题的相关文章

C语言实现括号配对问题

代码如下: #include<stdio.h> #include<string.h> #include<stdlib.h> // 写一个判断的括号是否匹配的函数 int MatchCheck(char a[],int len){ int flag = 0; char s[10000]; int top,i; char temp; // 初始化一个栈 top = 0; for(i=0;i<len;i++){ if(a[i]=='['){ // 如果是左括号直接入栈

java语言概述

a语言概述  Java之父是谁?你造吗?  常见的JDK版本:  JDK1.4.2  JDK5  JDK7 (2)Java语言的特点  有很多小特点,重点有两个开源,跨平台 (3)Java语言是跨平台的  针对不同的操作系统,依靠不同的jvm来实现的. (4)Java语言的平台se,me,ee b:JDK,JRE,JVM的作用及关系(掌握) (1)作用  JVM:保证Java语言跨平台  JRE:Java程序的运行环境  JDK:Java程序的开发环境 (2)关系  JDK:JRE+工具  JR

java--学习java从这里开始:Java语言基础(1)《基础知识篇》--黑马程序员

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Java语言基础(1) 从这篇日记开始说一些关于java的语言基础知识, 1  Java语言概述 java的创始人——詹姆斯·高斯林(James Gosling) 1977年获得了加拿大卡尔加里大学计算机科学学士学位,1983年获得了美国卡内基梅隆大学计算机科学博士学位,毕业后到IBM工作,设计IBM第7一代工作站NeWS系统,但不受重视.后来转至Sun公司,1990年,与Patrick,Na

《谁说大象不能跳舞》摘录(二)

第七章 打造领导班子 1993年年末,我逐渐将注意力转移到整个IBM的团队建设.我的高层管理班子以及我们的董事会建设上.如果你今天问我,什么是我在IBM任职期间自认为做得最出色的一件事,那么我会告诉,这件事就是:打造IBM的领导班子—即,当我退位的时候,我的接班人是一个IBM的老员工,而且,我们所有的主要业务单位的负责人,也必须是IBM的老员工. 我认为,如果我加盟IBM的时候,带来一帮公司以外的人,并神奇地在IBM的老员工的岗位上做得比老员工们更好的话,现在还要这样做或许太天真太危险.我就是一

javaEE(7)_EL表达式语言

一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 获取数据: •EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数据.(某个web域 中的对象,访问javabean的属性.访问list集合.访问map集合.访问数组) 执行运算: •利用EL表达式可以在JSP页面中执行一些基本的关系运算.逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算.${user==null} 获取web开发常用对象 •EL 表达式

20165230 学习基础和C语言基础调查

20165230 学习基础和C语言基础调查 技能学习经验 我擅长弹钢琴.小时候我曾上过很多兴趣班,比如钢琴.跳舞.书法.绘画等等,唯一坚持至今的只有钢琴.仔细一算学习钢琴至今已有12年,不能说已经精通,但已比大多数人更加熟练这项技能.对于弹钢琴最重要的就是需要反复的练习和有持之以恒的毅力.最开始练习弹钢琴时是非常枯燥无味的,因为练习的曲目是最基本最简单的音符,并不能一开始就练习你喜欢的曲目.只有通过不断的练习抬指和固定手型,才能拥有扎实的基本功,进而能在日后练习难度更大的曲目时得心应手.这和娄老

java语言程序

第一章 Jave语言基础 1.1 Java语言的特点 领会Java语言的特点.关键字 1010-11.Java语言采用多种机制来保证可移植性,其中最主要的是______.虚拟机 1110-11.Java语言是一种 ____强类型语言___ 语言,它约束程序员必须遵守规定编写程序,能让编译器检测出程序中尽可能多的错误. 1.2 Java应用程序和小应用程序 识记      Java应用程序与小应用程序的特点和区别 11.一个应用程序必须在某个类中定义的方法是______.main() 1201-

Java程序语言的后门-反射机制

在文章JAVA设计模式-动态代理(Proxy)示例及说明和JAVA设计模式-动态代理(Proxy)源码分析都提到了反射这个概念. // 通过反射机制,通知力宏做事情method.invoke(object, args);// 通过反射,将h作为参数,实例化代理类,返回代理类实例.return cons.newInstance(new Object[]{h});而且在 // 将接口类对象数组clone一份.final Class<?>[] intfs = interfaces.clone();也

C语言:C语言程序设计初步

.:.:第三章:c语言程序设计初步:.:. 第三章: C语言程序设计初步 C语言程序设计 本课介绍C语言程序设计的基本方法和基本的程序语句.从程序流程的角度来看,程序可以分为三种基本结构, 即顺序结构.分支结构.循环结构. 这三种基本结构可以组成所有的各种复杂程序.C语言提供了多种语句来实现这些程序结构. 本章介绍这些基本语句及其应用,使读者对C程序有一个初步的认识, 为后面各章的学习打下基础. C程序的语句 C程序的执行部分是由语句组成的. 程序的功能也是由执行语句实现的.C语句可分为以下五类