Description
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。
Input
第一行男士人数m和女士人数n(1<=m,n<=100);
第二行舞曲的数目k(1<=k<=100)。
Output
共k行,每行两个数,表示配对舞伴的序号,男士在前,女士在后。
Sample Input
4 3
6
Sample Output
1 1
2 2
3 3
4 1
1 2
2 3
题目很简单,已经告诉了舞曲数目,用两个数组,循环遍历即可。
用队列的话,构造俩个循环队列存放男女人数编号,然后循环遍历k次打印出编号即可。
主要注意循环队列的构建,多加练习,增加熟练度。
思路很简单。
这里给出循环队列代码实现,以及数组代码实现。
#include<stdio.h>
#include<malloc.h>
typedef struct QNode{
int x;
struct QNode *next;
}QDataNode;
typedef struct{
QDataNode *front;
QDataNode *rear;
}QHeadNode,*LinkQueue;
int InitQueue(LinkQueue *Q);
int EnQueue(LinkQueue *Q,int elem);
int InitQueue(LinkQueue *Q)
{
LinkQueue qhead=(LinkQueue)malloc(sizeof(QHeadNode));
QDataNode *vhead=(QDataNode *)malloc(sizeof(QDataNode));
if(qhead==NULL||vhead==NULL)
{
return -1;//内存分配失败
}
vhead->next=NULL;
*Q=qhead;
(*Q)->front=vhead;
(*Q)->rear=vhead;
return 0;
}
int EnQueue(LinkQueue *Q,int elem)//入队列
{
QDataNode *p=(QDataNode *)malloc(sizeof(QDataNode));
p->x=elem;
(*Q)->rear->next=p;
(*Q)->rear=p;
(*Q)->rear->next=(*Q)->front->next;//循环队列 !!!
}
int main()
{
int m,n,k;
scanf("%d%d%d",&m,&n,&k);
//建立两个队列 存放男女编号
LinkQueue Q1;
InitQueue(&Q1);
for(int i=1;i<=m;i++)
{
EnQueue(&Q1,i);
}
LinkQueue Q2;
InitQueue(&Q2);
for(int i=1;i<=n;i++)
{
EnQueue(&Q2,i);
}
//用两个指针 遍历两个队列 打印编号
QDataNode *p1,*p2;
p1=Q1->front->next;
p2=Q2->front->next;
for(int i=0;i<k;i++)//循环遍历k次
{
printf("%d %d\n",p1->x,p2->x);
p1=p1->next;
p2=p2->next;
}
}
数组代码实现:
#include<stdio.h>
int main()
{
int m[100],n[100];
int M,N,i,k;
scanf("%d%d%d",&M,&N,&k);
for(i=1;i<=M;i++)//数组存放编号
m[i]=i;
for(i=1;i<=N;i++)
n[i]=i;
for(i=1;i<=k;i++)
{
if(i<=M)
printf("%d ",m[i]);
else
{
if(i%M==0)//取余控制循环
printf("%d ",m[M]);
else
printf("%d ",m[i%M]);
}
if(i<=N)
printf("%d\n",n[i]);
else
{
if(i%N==0)
printf("%d\n",n[N]);
else
printf("%d\n",n[i%N]);
}
}
}