地址:
点击打开链接
和上一题目一样的操作,代码:
#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; }