/***************************************************************/ * Copyright (c) 2009 eryar All rights reserved. * * * * File : Main.cpp * * Date : 2009-04-11 21:01 * * Author : eryar@163.com * * * * Description: * * 三对情侣参加婚礼,三个新郎为A,B,C, 三个新娘为X,Y,Z. 有* * 人不知道谁和谁结婚, 于是询问了新人中的三位, 但听到的回答* * 是这样的: A说他将和X结婚; X说她的未婚夫是C; C说他将和Z结* * 婚. 这人听后知道他们都在开玩笑, 全是假话. 请编程找出谁将* * 和谁结婚. * * * /***************************************************************/ #include <iostream> using namespace std; inline char GetChar(int i); // 对函数的内联声明必须在调用之前 int main(int argc, char *argv[]) { for (int x=1; x<=3; ++x) { // 穷举X的所有情况 for (int y=1; y<=3; ++y) { // 穷举Y的所有情况 for (int z=1; z<=3; ++z) { // 穷举Z的所有情况 if (x!=1 && x!=3 && z!=3 // 若满足条件, 则找到正确答案 && x!=y && x!=z && y!=z) { cout<<"Aha! Find out the truth finally!"<<endl; cout<<GetChar(x)<<" will marry X."<<endl; cout<<GetChar(y)<<" will marry Y."<<endl; cout<<GetChar(z)<<" will marry Z."<<endl; } } } } return 0; } char GetChar(int i) // 此处声明inline编译并不认为是内联 { switch(i) { case 1: return 'A'; break; case 2: return 'B'; break; case 3: return 'C'; break; default: return 0; } } /* 问题分析与算法设计 ================== 将A,B,C三人用1,2,3表示, 将X和A结婚表示为"X=1", 将Y不与A结婚表示为"Y!=1". 按题目中的叙述可以写出表达式: X != 1 A不与X结婚 X != 3 X的未婚夫不是C Z != 3 C不与Z结婚 题目中还隐含着X,Y,Z三个新娘不能结为配偶,则有: X != Y X != Z Y != Z 穷举种种可能情况, 代入上述表达式中进行推理运算. 若假设的情况使上述表达式的结果均为真, 则假设就 是正确的结果. ==================================================== 可考虑用位运算来解决此类问题. */