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

 

posted @ 2015-10-27 21:40  默默笙萧  阅读(2216)  评论(0编辑  收藏  举报