题目:
对象指针与对象数组(拉丁舞)
怡山小学毕业文艺晚会上,拉丁舞是最受欢迎的节目。不过,每年为了排练这个节目,舞蹈组都会出现一些纠纷。有些同学特别受欢迎,有些却少人问津,因此安排舞伴成为舞蹈组陈老师最头疼的问题。
为了解决这一问题,今年陈老师决定让按先男生后女生,先低号后高号的顺序,每个人先报上自己期待的舞伴,每人报两位,先报最期待的舞伴。接下来按先男生后女生,先低号后高号的顺序,依次按以下规则匹配舞伴:
(1)每个人均按志愿顺序从前到后确定舞伴。如果第一志愿匹配不成功,则考虑第二志愿。
(2)如果A的当前志愿为B,则如果B未匹配舞伴,且有以下情形之一者,A和B匹配成功:
2a) B的期待名单中A。
2b) B的期待名单中没有A,但B期待的两位舞伴均已匹配成功,所以B只能与A凑合。
输入时先输入男生数m, 接下来m行,第一项为学生的姓名,后两项为期待舞伴的编号,编号从0开始,最大为女生数减1。接下来输入女生数f,接下来f行,第一项为学生的姓名,后两项为期待舞伴的编号,编号从0开始,最大为男生数减1。
输出时按男生的编号顺序输出 姓名:舞伴姓名
注意两个姓名间有冒号隔开
###函数接口定义:
Student的两个成员函数:
void printPair();
void addPair();
裁判测试程序样例:
#include <iostream>
#include <string>
using namespace std;
const int K=2;
const int N=20;
class Student{
string name;
Student *welcome[K];
Student *pair;
public:
void init(string &name, Student *a, Student *b) {
this->name=name;
welcome[0]=a;
welcome[1]=b;
pair=NULL;
}
void printPair();
void addPair();
};
/* 请在这里填写答案 */
int main(){
Student male[N], female[N];
int m, f, i, j, a, b;
string name;
cin>>m;
for(i=0;i<m;i++){
cin>>name>>a>>b;
male[i].init(name, &female[a], &female[b]);
}
cin>>f;
for(i=0;i<f;i++){
cin>>name>>a>>b;
female[i].init(name, &male[a], &male[b]);
}
for(i=0;i<m;i++) male[i].addPair();
for(i=0;i<f;i++) female[i].addPair();
for(i=0;i<m;i++) male[i].printPair();
return 0;
}
输入样例:
5
M0 3 1
M1 1 3
M2 1 4
M3 3 1
M4 0 3
5
F0 0 2
F1 2 0
F2 2 1
F3 2 4
F4 3 2
输出样例:
M0:F1
M2:F4
M4:F0
说明:匹配过程如下:
(1)M0先选择F3, 但F3并未期待M0;接下来M0选择F1, F1也期待M0,故匹配成功。
(2)M1选择F1, 但F1已匹配,故,不成功;M1选择F3,但F3未期待M1,仍然不成功。
(3)M2选择F1,F1已匹配;M2选择F4, F4未匹配且也期待M2,故匹配成功。
(4)M3选择F3,但F3未期待他,不成功;M3选择F1,F1已匹配,不成功。
(5)M4选择F0, F0不期待M4,但是F0期待的M0和M2已分配,所以凑合,匹配成功。
(6)F0已匹配, F1已匹配。
(7)F2选择M2, M2已匹配,不成功; F2选择M1, M1未匹配,但期待表中没有F2,且F3也未分配,故不成功。
(8)F3选择M2, M2已匹配,不成功;F3选择M4, M4已匹配,不成功。
(9)F4已匹配。
代码:
void Student::addPair()
{
if (pair) return;
for (int i = 0; i < 2;i ++)
{
if (!welcome[i]->pair)
{
if (welcome[i]->welcome[0] == this || welcome[i]->welcome[1] == this)
{
pair = welcome[i];
welcome[i]->pair = this;
return;
}
else if (welcome[i]->welcome[0]->pair && welcome[i]->welcome[1]->pair)
{
pair = welcome[i];
welcome[i]->pair = this;
return;
}
}
}
}
void Student::printPair()
{
if (!pair)
return;
cout << name << ":" << pair->name << endl;
}