配对新郎和新娘问题

三对情侣参加婚礼,三个新郎为 A、B、C,三个新娘为 X 、Y、Z。有人不知道谁和谁结婚,于是询问了六位新人中的三位,但听到的回答是这样的 :A 说他将和 X 结婚 ;X 说她的未婚夫是C ;C 说他将和 Z 结婚。这人听后知道他们在开玩笑,全是假话 。请编程找出谁将和谁结婚 。

。。。此题我用了邻接矩阵,根据题目给出的关系给邻接矩阵赋了初值。。虽然算出来了,但是写的贼麻烦。。。

这里我把我的代码和网上给出的答案都列在下面了。。。

注释我都列出来了...

我写的:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int vis[3][3];  //1代表两人为伴侣,2表示两人关系不确定,0表示两人不是伴侣
void init() //初始化关系不确定
{
    for (int i=0;i<3;i++)
        for (int j=0;j<3;j++)
            vis[i][j]=2;
}
void output () //输出结果
{
    char s1[5]="XYZ";
    char s2[5]="ABC";
    int  re[3];
    for (int i=0;i<3;i++)
    for (int j=0;j<3;j++)
        if(vis[i][j]==1)
             re[i]=j;
    for (int i=0;i<3;i++)
        printf("%c的未婚夫为%c\n",s1[i],s2[re[i]]);
}
int main()
{
     int num=0; //表示确定关系的对数
     init();
     //题目给出的条件
     vis[0][0]=0;
     vis[0][2]=0;
     vis[2][2]=0;
     while (num<3)
     {
         for (int i=0;i<3;i++)
         {
            //当一个人与两个人确定不是情侣关系时,可断定与另一个人是情侣
            if(!vis[i][0]&&!vis[i][1]&&vis[i][2]==2)
             {
                 num++;
                 vis[i][2]=1;
                 for (int j=0;j<3;j++)
                    if(j!=i)
                       vis[j][2]=0;
                 continue;
             }
            if(!vis[i][0]&&vis[i][1]==2&&!vis[i][2])
             {
                 num++;
                 vis[i][1]=1;
                 for (int j=0;j<3;j++)
                    if(j!=i)
                       vis[j][1]=0;
                continue;
             }
            if(vis[i][0]==2&&!vis[i][1]&&!vis[i][2])
             {
                 num++;
                 vis[i][0]=1;
                 for (int j=0;j<3;j++)
                    if(j!=i)
                       vis[j][0]=0;
                continue;
             }
         }
     }
     output();
}

网上给出的:

#include <stdio.h>

int main()
{
    int x, y, z;

    for (x = 1; x <= 3; x++)
    {
        for (y = 1; y <= 3; y++)
        {
            for (z = 1; z<= 3; z++)
            {
                if (x != 1 && x != 3 && z != 3 && x != y && y != z && x != z)
                {
                    printf("X will marry to %c.\n", 'A' + x - 1);
                    printf("Y will marry to %c.\n", 'A' + y - 1);
                    printf("Z will marry to %c.\n", 'A' + z - 1);
                }
            }
        }
    }

    return 0;
}    

猜你喜欢

转载自blog.csdn.net/qq_41410799/article/details/82526499
今日推荐