地址:
点击打开链接
和上一题目一样的操作,代码:
#include<string.h>
#include<iostream>
#include<stdio.h>
#include<string>
#include<map>
#include<queue>
using namespace std;
#define N 27
char s[N][N];
int b[N][N],g[N][N],Hash[N];
int bM[N],gM[N],Rank[N];
int n;
queue<int>q;
int main()
{
char str[N];
int T,t1,t2,i,j,flag,t;
// freopen("test.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(bM,0,sizeof(bM));//配对
memset(gM,0,sizeof(gM));
memset(Hash,0,sizeof(Hash));
for(i=1;i<=n;i++)
{
scanf("%s",str);
Hash[str[0]-'a'+1]=1;//标记男生
}
for(i=1;i<=n;i++)
scanf("%s",str);
for(i=1;i<=n;i++)
{
scanf("%s",s[i]);
t=s[i][0]-'a'+1; //男生
for(j=1;j<=n;j++)
{
b[t][j]=s[i][j+1]-'A'+1;//男生喜欢的女生排序
}
Rank[t]=1;//男生从第1个女生(最喜欢的)开始挑选
bM[t]=0;//男生还未匹配任何女生
q.push(t);//男生入队
}
for(i=1;i<=n;i++)
{
scanf("%s",s[i]);
t=s[i][0]-'A'+1;//女生
for(j=1;j<=n;j++)
{
g[t][s[i][j+1]-'a'+1]=j;//女生喜欢的男生排名
}
gM[t]=0;//女生未匹配男生
}
while(!q.empty())
{
i=q.front();//i表示男生
q.pop();
t=b[i][Rank[i]++];//按顺序挑选女生
if(!gM[t])//女生没有男朋友
{
gM[t]=i;
bM[i]=t;
}
else if(g[t][i]<g[t][gM[t]])//女生有男朋友,但是更喜欢i
{
bM[gM[t]]=0;//该男生自由
q.push(gM[t]);//入队
gM[t]=i;
bM[i]=t;
}
else
q.push(i);
}
for(i=1;i<=26;i++)
{
if(Hash[i])//按字母顺序输出,hash[i]=1表示男生
printf("%c %c\n",i-1+'a',bM[i]-1+'A');
}
if(T!=0)
printf("\n");
}
return 0;
}