问题:三对情侣参加婚礼,3个新郎a、b、c,3个新娘x、y、z,有人想知道究竟谁和谁结婚,于是就问新人中的三位,得到如下提示:a说他将和x结婚;x说他的未婚夫是c;c说他将和z结婚。这人事后知道他们都在开玩笑,说的全是假话,那么究竟谁与谁结婚呢?
思路:用“a=1”表示新郎a和新娘x结婚,同理,如果新郎a不与新娘x结婚则写成“a!=1”,即x,y,z使用1,2,3表示,根据题意可以得到如下的表达式:
a!=1 a不与x结婚
c!=1 c不与x结婚
c!=3 c不与z结婚
其实根据上面3个表达式,我们就可以进行推理结果了:
c不与x,z结婚,那么肯定是和y结婚,所以c=2
a不与x结婚,那么肯定是与z结婚,所以a=3
最后剩下的肯定是b与x结婚,即b=1
那么我们如何使用程序表达呢?是想,对于新郎而言,每一个人都可能与三位新娘中的任意一位结婚,所以我们需要根据事先已知条件遍历所有的情况,得到最终结果,但是还需要注意一个隐含的条件,那就是,3个新郎不能够互为配偶,即a!=b且b!=c且a!=c。
具体代码实现:
int main(int argc, const char * argv[]) {
int a,b,c;
for (a = 1; a <= 3; a++) { //穷举a的所有可能性
for (b = 1; b <= 3; b++) { //穷举b的所有可能性
for (c = 1; c <= 3; c++) { //穷举c的所有可能性
if (a != 1 && c != 1 && c != 3 && a !=b && b != c && a != c) {
//如果表达式为真输出结果,否则继续下次循环
printf("%c 将嫁给 a\n",'x' + a - 1);
printf("%c 将嫁给 b\n",'x' + b - 1);
printf("%c 将嫁给 c\n",'x' + c - 1);
}
}
}
}
/*
输出结果:
z 将嫁给 a
x 将嫁给 b
y 将嫁给 c
printf("%c 将嫁给 a\n",'x' + a - 1); 函数解释:%c表示输出一个字符,'x' + a - 1表示字符x加上某个数值,其结果会得到另外一个字符,这里涉及到ASCII值,每一个字母都对应一个值。所以在计算之后会得到对应的x,y,z.可以看下表:
*/
return 0;
}