三对情侣参加婚礼,三个新郎为 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;
}