鱼C论坛

 找回密码
 立即注册
查看: 2950|回复: 0

舞伴问题

[复制链接]
发表于 2014-12-15 16:29:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
假定在一舞会上,男士排成一队,女士排成一队。
跳舞开始时,依次从男队和女队的队头各出一人配成舞伴。
若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。
[基本要求]
模拟上述舞伴系统,并能计算对于任何男士A和女士B在哪一轮舞曲中的k次跳舞。
[实现提示]
用循环队列实现上述操作*/


#include <stdio.h>
#include <malloc.h>
#define MAX 7
typedef int elemtype;
typedef struct
{
        elemtype data[MAX];
        int front, rear;
        int num;//人数
}sequeue;
typedef struct
{
        int turn;
    int  order;
}partner;
void addqueue();     //入队
elemtype outqueue(); //出队
elemtype getqueue(); //读取队头
void play();         //配对输出情况
void search();       //配对查找情况
void inqueue();      //男女入队
void menu();
sequeue *man,*woman;
partner dance[MAX][MAX];

main()
{   
        char ch;
        inqueue();
        play();
        printf("\n按任意键查找男女士配对情况,按 @ 号建结束 \n");
        scanf("%s",&ch);
        getchar();

        while(ch != '@')
        {
                search();
            printf("\n按任意键查找男女士配对情况,按 @ 号建结束\n");
            scanf("%s",&ch);
                getchar();
        }
}

void addqueue(sequeue *q,int x)
{
        if((q->rear+1)%MAX==q->front)
                printf("队满\n");
        else
        {
                q->rear=(q->rear+1)%MAX;
                q->data[q->rear]=x;
        }
}

int outqueue(sequeue *q)
{
        if(q->rear==q->front)
                return 0;
        else
        {
                q->front=(q->front+1)%MAX;
                addqueue(q,q->data[q->front]);
                return q->data[q->front];
        }
}

void inqueue()
{
        int i;
        //sequeue *man,*woman;
        man=(sequeue *)malloc(sizeof(sequeue));
        woman=(sequeue *)malloc(sizeof(sequeue));
        printf("请输入男士和女士的人数:");
        scanf("%d%d",&man->num,&woman->num);
        while(man->num>MAX || woman->num>MAX)
        {
                printf("\n输入数目过大,请重新输入!\n\n请输入男士和女士的人数:");
        scanf("%d%d",&man->num,&woman->num);
        }
        for(i=1;i<=man->num;i++)
                addqueue(man,i);
        for(i=1;i<=woman->num;i++)
                addqueue(woman,i);
}

void play()
{   
//        sequeue *man;
//        sequeue *woman;
//        partner p[MAX][MAX];
        int m,w,i,j;
        m=outqueue(man);//男士首次出队
        w=outqueue(woman);//女士首次出队
        i=1;
        j=1;
        dance[m][w].turn=i;   //第一轮
        dance[m][w].order=j; //第一次
        printf("%d\t%d\n",m,w);
        while(m<man->num || w<woman->num)
        {
                m=outqueue(man);
            w=outqueue(woman);
                j=j+1;
                dance[m][w].turn=i;
                dance[m][w].order=j;
            printf("%d\t%d\n",m,w);
            if(man->num <= woman->num && m==man->num)
                {
                        printf("男士人数已排完,第%d个曲目的舞蹈结束 !\n",i);
                        i=i+1;
                        j=0;
                }
                if(man->num > woman->num && w==woman->num)
                {
                        printf("女士人数已排完,第%d个曲目的舞蹈结束 !\n",i);
                        i=i+1;
            dance[m][w].turn=i;
                        j=0;
                }
        }
        printf("\n搭配完成 !\n");
}

void search()
{
        int m,w;
        printf("\n请输入待查找的男女序号--");
        scanf("%d%d",&m,&w);
        if(dance[m][w].turn==0)
                printf("\n该男士与该女士没有搭配曲目!\n");
        else
                printf("\n*****第 %d 号男士和第 %d 号女士在第 %d 轮曲目第 %d 次入场!*****\n",m,w,dance[m][w].turn,dance[m][w].order);
}

感觉还有些小缺陷,哪位大神能帮我改进改进,谢谢



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-7 19:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表