算法-经典趣题-新郎和新娘

Java
287
0
0
2022-11-12

本文为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]);
                    }
                }
            }
        }
    }
}

img

转载自 joshua317博客 https://www.joshua317.com/article/157