题目:假定在一舞会上,男士排成一队,女士排成一队。跳舞开始时,依次从男队和女队的队头各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。
代码和注释如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Queue { //创建Queue循环队列结构体
int Front;
int Rear;
char elem[100][100];
int Queuesize;
};
void Creat_Queue(Queue &Q)
{//建立一个队列
int n, i;
Q.Front = Q.Rear = 0; //定义初始队头队尾指向
while(1){
printf("请输入跳舞人数:");
scanf("%d", &n);
if(n<100) break;
else printf("输入人数错误,请重新输入");
}
Q.Queuesize = n + 1;
printf("请输入各跳舞人名:");
for (i = 0; i < n; i++)
scanf("%s", Q.elem[i]);
Q.Rear = n; //rear指向最后一位
}
int QueueEmpty(Queue Q)
{ //判断队列是否为空,空返回1,非空返回0
if (Q.Front == Q.Rear)
return 1;
else
return 0;
}
void PutQueue(Queue &Q, char *str) { //出队列
int l = strlen(str);
for (int i = 0; i <= l; i++)
{
Q.elem[Q.Rear][i] = str[i]; //每跳完一个便插入队尾
}
Q.Rear = (Q.Rear + 1) % Q.Queuesize; //队尾指针后移一位
}
// 比较两个字符串相同,要让字符串每一位都相同
bool is_Same(char s1[], char s2[])
{
int l1 = strlen(s1), l2 = strlen(s2); //字符串的长度
if (l1 != l2) //长度不同就肯定不同
return false;
for (int i = 0; i <= l1 ; i++){
if (s1[i] != s2[i]) //有一位不同就肯定不同
return false;
}
return true;
}
int min(int a, int b)
{
if (a < b)
return a;
return b;
}
int Judge_Queue(Queue &M, Queue &W) //人数少的确定舞曲的轮数
{
int k1 = 0, k, m = 0;
char man[100], wuman[100]; //需要计算的男女各一名
printf("请输入需要配对的人:");
printf("男:");
scanf("%s", man);
printf("女:");
scanf("%s", wuman);
printf("您希望他们这是第几次互相跳舞");
scanf("%d", &k);
while (k1 < k) // 如果一块跳舞的次数少于k次就继续循环
{
int m_size = (M.Queuesize-1) ;// 男士的人数
int w_size = (W.Queuesize-1) ;// 女士的人数
int dance_size = min(m_size, w_size); //一支舞曲去跳舞的人数
for (int i = 1; i <= dance_size; i++) // 从队头开始模拟跳舞
{
// printf("%s %s\n", M.elem[M.Front], W.elem[W.Front]);
if (is_Same(man, M.elem[M.Front]) && is_Same(wuman, W.elem[W.Front]))//这支舞曲第i个出场的男士和女士
{ //如果和我们指定的两个人相同那么一块跳舞的次数+1
k1 = k1 + 1;
}
//跳完之后要按照顺序插入到队尾,舞者重新排序
PutQueue(M, M.elem[M.Front]);
PutQueue(W, W.elem[W.Front]);
//出队
M.Front = (M.Front + 1) % M.Queuesize; //头指针后移,出队
W.Front = (W.Front + 1) % W.Queuesize;
}
m = m + 1;
//printf("!!!");
if((M.Queuesize+1)*(W.Queuesize+1)<m && k1==0) {
printf("错误,这两个人永远不能配对"); return 0; }
}
return m;
}
int main()
{
Queue M, W;
printf("男队:\n");
Creat_Queue(M);
printf("女队:\n");
Creat_Queue(W);
printf("发生在第%d轮舞曲", Judge_Queue(M, W));
return 0;
}
测试数据:
男:1,2,3,4
女:a,b,c
使男生2和女生b配对
这是他们第4次配对
结果:16