这个问题怎么用顺序队列解决?

在一个舞会上,有男队(m人)和女队(n人)两个队伍,并分别为两个队的成员依次进行编号,问:有x号男生和y号女生会在这场舞会中第几首曲子共舞?
输入四个整数m,n,x,y,分别表示男队人数,女
队人数,x号男生,y号女生
输出一个整数,x号男生会和y号女生在第几首曲子共舞。

#include <stdio.h>

int main() {
    int m, n, x, y, res;
    scanf("%d %d %d %d", &m, &n, &x, &y);
    res = (x - 1) * n + y;
    printf("%d", res);
    return 0;
}

这个问题的思路是,首先用一个循环队列来存储男生和女生的编号,然后每次从队头取出一个男生和一个女生,计算他们的共舞曲目,如果两个队列都不为空,就继续这个过程,直到有一个队列为空为止。


#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 //定义队列的最大容量

typedef struct {
    int data[MAXSIZE]; //用数组存储队列元素
    int front; //队头指针
    int rear; //队尾指针
} Queue;

//初始化队列
void InitQueue(Queue *Q) {
    Q->front = Q->rear = 0; //队头和队尾都指向0
}

//判断队列是否为空
int IsEmpty(Queue Q) {
    return Q.front == Q.rear; //如果队头和队尾相等,说明队列为空
}

//判断队列是否已满
int IsFull(Queue Q) {
    return (Q.rear + 1) % MAXSIZE == Q.front; //如果队尾加1后取模等于队头,说明队列已满
}

//入队操作
void EnQueue(Queue *Q, int x) {
    if (IsFull(*Q)) { //如果队列已满,打印错误信息并退出
        printf("Queue is full!\n");
        exit(1);
    }
    Q->data[Q->rear] = x; //将元素x存入队尾位置
    Q->rear = (Q->rear + 1) % MAXSIZE; //更新队尾指针
}

//出队操作
int DeQueue(Queue *Q) {
    int x;
    if (IsEmpty(*Q)) { //如果队列为空,打印错误信息并退出
        printf("Queue is empty!\n");
        exit(1);
    }
    x = Q->data[Q->front]; //取出队头元素
    Q->front = (Q->front + 1) % MAXSIZE; //更新队头指针
    return x; //返回出队元素
}

//计算共舞曲目的函数
int Dance(int m, int n, int x, int y) {
    Queue male, female; //定义男生和女生的队列
    int i, j, k, count;
    InitQueue(&male); //初始化男生队列
    InitQueue(&female); //初始化女生队列

    for (i = 1; i <= m; i++) { //将男生编号依次入男生队列
        EnQueue(&male, i);
    }

    for (j = 1; j <= n; j++) { //将女生编号依次入女生队列
        EnQueue(&female, j);
    }

    count = 0; //初始化共舞曲目计数器

    while (!IsEmpty(male) && !IsEmpty(female)) { //当两个队列都不为空时,循环进行配对
        i = DeQueue(&male); //取出一个男生编号
        j = DeQueue(&female); //取出一个女生编号

        count++; //共舞曲目加一

        if (i == x && j == y) { //如果是目标男生和女生,返回共舞曲目数
            return count;
        }

        k = rand() % 2; //随机生成01

        if (k == 0) { //如果是0,表示男生想再跳一曲,将他重新入男生队列
            EnQueue(&male, i);
        }

        k = rand() % 2; //再次随机生成01
 if (k == 0) { //如果是0,表示女生想再跳一曲,将她重新入女生队列
            EnQueue(&female, j);
        }
    }

    return -1; //如果两个队列中有一个为空,说明没有找到目标男生和女生的配对,返回-1
}

//主函数
int main() {
    int m, n, x, y, result;
    printf("请输入男生人数和女生人数:\n");
    scanf("%d%d", &m, &n);
    printf("请输入目标男生编号和女生编号:\n");
    scanf("%d%d", &x, &y);
    result = Dance(m, n, x, y); //调用共舞曲目函数
    if (result == -1) { //如果返回-1,表示没有找到配对
        printf("没有找到目标男生和女生的配对。\n");
    } else { //否则,打印共舞曲目数
        printf("目标男生和女生会在第%d首曲子共舞。\n", result);
    }
    return 0;
}