1027: 舞伴问题

题目描述
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。要求编写程序实现舞伴问题。

输入
输入一共5行,第一行是男生人数m;第二行依次是男生的姓名;第三行是女士的人数n;第四行依次是女士的姓名;第五行是跳舞的轮数。

输出
配对的男士和女士的姓名。

样例输入
5
A B C D E
3
F G H
2

样例输出
B G

此题有点坑人
①学校oj上的“样例输入”,你如果点击黄色按钮“复制”,把数据粘贴到控制台,恭喜你,数据始终不正确。因为样例输入里,最后面多了几个空格和换行符,肉眼看不出来,天坑。
②getchar()比较多,一不小心数据出错
③输入数据时,除了输入字母,还输入空格。
比如
A B C D E
其实是五个字母,四个空格,一共九个数据

用C++的queue写起来要顺畅多了

#include<stdio.h>
#include<malloc.h>
typedef struct qnode//数据结点
{
    char data;
    struct qnode *next;
}DataNode;
typedef struct node//链队头结点
{
    DataNode *Front;
    DataNode *Rear;
}LinkQuNode;
void Init(LinkQuNode*&q)//初始化
{
    q=(LinkQuNode*)malloc(sizeof(LinkQuNode));
    q->Front=q->Rear=NULL;
}
bool Empty(LinkQuNode*q)
{
    return (q->Rear==NULL);
}
void Push(LinkQuNode*&q,char e)
{
    //步骤较多,不能少了哦
    DataNode *p;
    p=(DataNode*)malloc(sizeof(DataNode));//创建头结点
    p->data=e;
    p->next=NULL;
    if(q->Rear==NULL)
    {//若链队为空,则新节点既是队首节点又是队尾结点
        q->Rear=q->Front=p;
    }else//若链队不为空
    {
        q->Rear->next=p;
        //将结点p链接到队尾,并将Rear指向它
        q->Rear=p;
    }
}
char Pop(LinkQuNode*&q)
{
    DataNode*t;
    char e;
    if(q->Rear==NULL) return '0';//原来队列为空,则结束函数
    t=q->Front;//t指向首结点
    if(q->Rear==q->Front)//原来队列中只有一个数据结点时
    {
        q->Rear=q->Front=NULL;
    }else//原来队列中有两个数据结点时
    {
        q->Front=q->Front->next;
    }
    e=t->data;
    free(t);//删除结点
    return e;
}
int main()
{
    int n,m,times;
    char ch,space;
    LinkQuNode *Man,*Woman;
    Init(Man);//别忘记初始化了哦
    Init(Woman);
    scanf("%d",&m);
    getchar();//getchar()不能少了哦
    for(int i=0;i<m;i++)
    {
        scanf("%c%c",&ch,&space);
        Push(Man,ch);
    }
    scanf("%d",&n);
    getchar();//getchar()不能少了哦
    for(int i=0;i<n;i++)
    {
        scanf("%c%c",&ch,&space);
        Push(Woman,ch);
    }
    char man,woman;
    scanf("%d",&times);
    getchar();//getchar()不能少了哦
    for(int i=1;i<=times;i++)
    {
        man=Pop(Man);//男性出队一个
        woman=Pop(Woman);//女性出队一个
        //啦啦啦,在跳舞
        //跳舞结束
        Push(Man,man);//跳舞完后,男生回男性队列
        Push(Woman,woman);//跳舞完后,女生回女性队列
        //到最后一轮,输出匹配的两个人
        if(i==times)
        {
            printf("%c %c",man,woman);
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值