【题目描述】
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。
【输入】
第一行两队的人数;
第二行舞曲的数目。
【输出】
配对情况。
【输入样例】
4 6
7
【输出样例】
1 1
2 2
3 3
4 4
1 5
2 6
3 1
【思路】:用一个数据结构存储,然后相继输出,如果不够再从一开始。
vector
#include <bits/stdc++.h>
using namespace std;
int main(){
int m,n,a,j=0,k=0;
cin>>m>>n>>a;
vector<int>num1;
vector<int>num2;
for(int i=1;i<=a;i++){
j++;
num1.push_back(j);
if(j==m)
j=0;
}
for(int i=1;i<=a;i++){
k++;
num2.push_back(k);
if(k==n)
k=0;
}
for(int i=1;i<=a;i++){
cout<<num1.front()<<" "<<num2.front();
num1.erase(num1.begin());
num2.erase(num2.begin());
if(i!=a)
cout<<endl;
}
return 0;
}
队列
#include <bits/stdc++.h>
using namespace std;
int main(){
int m,n,a,j=0,k=0,b,c;
cin>>m>>n>>a;
queue<int>num1;
queue<int>num2;
for(int i=1;i<=a;i++){
j++;
num1.push(j);
if(j==m)
j=0;
}
for(int i=1;i<=a;i++){
k++;
num2.push(k);
if(k==n)
k=0;
}
for(int i=1;i<=a;i++){
b=num1.front();
c=num2.front();
cout<<b<<" "<<c;
num1.pop();
num2.pop();
if(i!=a)
cout<<endl;
}
return 0;
}
链表
#include<bits/stdc++.h>
using namespace std;
int n,m,i,j,k;
struct node{
int x;
node *next;
node(){
next=NULL;
}
}*p,*q,*f1,*f2,*t1,*t2;
int main(){
cin>>n>>m>>k;
f1=new node; t1=new node;
f1->x=1;
p=new node;
p=f1;
for (i=2;i<=n;i++){
q=new node;
q->x=i;
p->next=q;
p=q;
}
t1=q;
f2=new node; t2=new node;
f2->x=1;
p=new node;
p=f2;
for (i=2;i<=m;i++){
q=new node;
q->x=i;
p->next=q;
p=q;
}
t2=q;
for (i=1;i<=k;i++){
cout<<f1->x<<" "<<f2->x;
if(i!=k)
cout<<endl;
p=f1;
f1=f1->next;
t1->next=p;
t1=p;
p=f2;
f2=f2->next;
t2->next=p;
t2=p;
}
return 0;
}
数组
#include <bits/stdc++.h>
using namespace std;
int main(){
int m,n,a,j=0,k=0;
cin>>m>>n>>a;
int num1[a],num2[a];
for(int i=1;i<=a;i++){
j++;
num1[i]=j;
if(j==m)
j=0;
}
for(int i=1;i<=a;i++){
k++;
num2[i]=k;
if(k==n)
k=0;
}
for(int i=1;i<=a;i++){
cout<<num1[i]<<" "<<num2[i];
if(i!=a)
cout<<endl;
}
return 0;
}
总体讲,只要不是用了等于白用的数据结构,基本都能解。