代码和注释如下:
#define _CRT_SECURE_NO_WARNINGS #include#include #include 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 %sn", 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) 测试数据:
男:1,2,3,4
女:a,b,c
使男生2和女生b配对
这是他们第4次配对
结果:16



