湘潭大学校赛G

Girls and Boys

Accepted : 50   Submit : 213
Time Limit : 1000 MS   Memory Limit : 65536 KB

 

N名单身女生和N名单身男生,每个人心中都有一个按喜欢程度对所有异性的排名。每天,所有单身男生都会向自己最喜欢的单身女生表白,而收到表白的女生则会接受她最喜欢的向她表白的男生。于是他们将脱离单身并组成情侣,且永不分离。

假设你有读心术,可以知道每个人心中的排名,那么你能够预测最后哪些人将会成为情侣么?

Input

有多组测试数据。每组测试数据的第一行是一个整数1 ≤ N ≤ 100。接下来N行,每行是一个1N的排列,代表各个男生对女生的排名。再接下来N行,每行也是一个1N的排列,代表各个女生对男生的排名。

Output

对每组数据,输出用空格隔开的N个数,其中第i个数代表男生i的女朋友的编号。

Sample Input

2
1 2
1 2
1 2
1 2
2
1 2
2 1
1 2
2 1

Sample Output

1 2
1 2
这题大家都说简单,但是我觉得一点也不简单,我模拟了1个半小时啊。各种改啊,各种错,本来思路就不是很清晰,再加上代码能力不过关
总写错,所以导致一次又一次的悲剧啊。呜呜~~
本题的思路是这样的,算了。我还是把我的思路在代码里注释出来吧,这样读着应该比较清晰也能读懂:
#include"stdio.h"
#include"string.h"

int vis1[105],vis2[105];
int boy[105][105],girl[105][105];
int sex[105],w[105];

int main( )
{
    int n,i,j,k,count;
    while(~scanf("%d",&n))
    {
        count=0;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                scanf("%d",&boy[i][j]);
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                scanf("%d",&girl[i][j]);
        memset(vis1,0,sizeof(vis1));//vis1[i]表示第i个男生是否配对成功;
        memset(vis2,0,sizeof(vis2));//vis2[i]表示第i个女生是否配对成功;
        memset(sex,0,sizeof(sex));  //里面记录着第i个男生的女朋友是第几个女生;
        while(count<n)              //count表示此时的情侣对数,如果已达到n对则自动跳出;
        {
            memset(w,0,sizeof(w));
            for(j=1;j<=n;j++)       //j表示女生的编号;
            {
                if(vis2[j]==1)
                    continue;
                for(k=1;k<=n;k++)   //k表示男生的编号;
                {
                    if(vis1[k]==1||w[k]!=0)
                        continue;
                    for(i=1;vis2[boy[k][i]]!=0;i++);//注意这里,找出第k个男生本次所要表白的女生;
                    if(boy[k][i]==j)//如果该女生敲好是此的第j个女生,那么表示该男生参与对j女生的表白;
                        w[k]=j;        //w[k]表示第k个男生所要表白的对象是j;
                }
                for(k=1;k<=n;k++)    //查找第j个女生在这些表白者中最喜欢的一个,只要有表白着就表示配对成功
                    if(w[girl[j][k]]==j)
                    {
                        vis1[girl[j][k]]=vis2[j]=1;
                        sex[girl[j][k]]=j;
                        count++;
                        break;
                    }
            }
        }
        for(i=1;i<=n;i++)
        {
            if(i==1)
                printf("%d",sex[i]);
            else
                printf(" %d",sex[i]);
        }
        printf("\n");
    }
    return 0;
}
        

    

 

posted @ 2012-05-21 21:25  朝圣の路  阅读(226)  评论(0编辑  收藏  举报