湘潭大学校赛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;

}

        



    

 

你可能感兴趣的:(大学)