| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
帮我看看,写了详细的注释,一直WA到凌晨了...实在不知道了。#include <iostream>
#include <string.h>
using namespace std;
const int NUM=300;
int N;
struct Person
{
bool be;//此位置有没有人
bool marry;//是否订婚
int step;//被拒绝到哪个位置
char spouse;
char per[NUM];//偏爱序列
}person[NUM];
void initialize()
{
int i;
for(i=0;i<NUM;i++)
{
person[i].be=0;
person[i].marry=0;
person[i].step=0;
person[i].spouse='\0';
memset(person[i].per,'\0',sizeof(person[i].per));
}
}
void marryed(char a,char b)//a男 b女
{
person[a].marry=1;
person[b].marry=1;
person[a].spouse=b;
person[b].spouse=a;
}
bool prefer(int mm,int gg)
{
char a=person[gg].spouse;int i;
for(i=0;;i++)
if(person[gg].per[i]==mm) return 1;
else if(person[gg].per[i]==a) return 0;
}
void choose(char mm)
{
char gg=person[mm].per[person[mm].step]; //下次该表白的男士
if(!person[gg].marry)
{
marryed(gg,mm);
}
else
{
if(prefer(mm,gg))//男士悔婚,so 他的对象pre现在未婚;
{
char pre=person[gg].spouse;//pre为前未婚妻
person[pre].spouse='\0';
person[pre].marry=0;
marryed(gg,mm);//成全新好上的
choose(pre);//让被甩的再找一个,此处递归应该没有错啊。
}
else
{
person[mm].step++;//继续往下一个寻找对象
choose(mm);
}
}
}
int main()
{
int cases;
scanf("%d",&cases);
while(cases--)
{
scanf("%d",&N);
initialize();
int i;
for(i=0;i<2*N;i++)
{
char name;
scanf(" %c",&name);
person[name].be=true;
}
getchar();
for(i=0;i<2*N;i++)
{
char per[NUM];
scanf("%s",per);
int j;
for(j=2;j<strlen(per);j++)
person[per[0]].per[j-2]=per[j];
}
for(i='A';i<='Z';i++)
if(person[i].be&&!person[i].marry) choose(i);
for(i='a';i<='z';i++)
if(person[i].be) printf("%c %c\n",i,person[i].spouse);
putchar('\n');
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator