本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/157
一、问题
新郎和新娘问题是非常典型的智力推理问题。
新郎和新娘问题的大意如下:
有三对新郎和新娘参加集体婚礼,三个新郞为A、B、C,三个新娘为X、Y、Z。主持婚礼的人一时间忘了谁应该和谁结婚。于是,他便问参加婚礼的6个人中的三个,得到的回答如下:
新郎A说他将和新娘X结婚;
新娘X说她将和新郎C结婚;
新郎C说她将和新娘Z结婚。
聪明的主持人知道他们在与他开玩笑,但是,此时主持人已经推算出了谁应该和谁结婚。那么,到底是谁应该和谁结婚呢?
二、分析
我们来分析下问题,三个新郎和三个新娘随机结婚的话,共有6种可能,根据前面所述的3个错误条,便可以采用穷尽法来逐个对照,直到找到正确的结婚对象。
现在我们将A、B、C这3人分别用 1、2、3 表示,将X和A结婚表示为"X=1",将X与C结婚表示为"X=3",将C与Z结婚表示为"Z=3"。按照题目中的叙述可以写出表达式:
- X!=1 A不与X结婚
- X!=3 X不与C结婚
- Z!=3 C不与Z结婚 题意还隐含着X、Y、Z这3个新娘不能结为配偶,则有:X!=Y 且X!=Z且Y!=Z,穷举以上所有可能的情况,代入上述表达式中进行推理运算,若假设的情况使上述表达式的结果均为真,则假设情况就是正确的结果。
三、编程
package com.joshua317;
public class Main {
public static void main(String[] args) {
char[] husband = {'A', 'B', 'C'};
char[] wife = {'X', 'Y', 'Z'};
int i;
System.out.println("参加婚礼的新郎为:");
for (i=0; i<3; i++) {
System.out.printf(" %c", husband[i]);
}
System.out.println();
System.out.println("参加婚礼的新娘为:");
for (i=0; i<3; i++) {
System.out.printf(" %c", wife[i]);
}
System.out.println();
int X, Y, Z;
//假定A、B、C这3人分别用 1、2、3 表示
//穷举x的全部可能配偶
for (X = 1; X <= 3; X++) {
//穷举y的全部可能配偶
for (Y = 1; Y <= 3; Y++) {
//穷举z的全部可能配偶
for (Z = 1; Z <= 3; Z++) {
if (X!=1 && X!=3 && Z!=3 && X!=Y && Y!=Z && X!=Z) {
//得到X,Y,Z对应的值
System.out.printf("X的值:%d, Y的值:%d, Z的值:%d\n", X,Y,Z);
//打印匹配的结果
System.out.printf("X与%c结婚\n", husband[X-1]);
System.out.printf("Y与%c结婚\n", husband[Y-1]);
System.out.printf("Z与%c结婚\n", husband[Z-1]);
}
}
}
}
}
}