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 }