问题
三对情侣结婚。新郎是A,B,C。新娘是X,Y,Z。有人不知道谁和谁结婚,于是询问了六个人中的三个。得到如下回复:A说他和X结婚,X说她的未婚夫是C,C说他将和Z结婚。这人听后确认这三个人都在开玩笑说假话,请你推断到底谁要和谁结婚。
分析
假设新郎新娘分别编号0,1,2。按照题目要求,有一下隐含条件:
- 1) 新郎之间不能结婚,新娘之间也不能结婚( 在这里,婚姻只限于男女之间)
- 2) 一个新郎只能取一个新娘,而且一个新娘也只能嫁一个新郎。
- 3) 0号新郎不能跟0号新娘结婚;
- 4) 2号新郎不能跟0号新娘结婚;
- 5) 2号新郎不能跟2号新娘结婚;
在程序实现过程中设定变量 i,j,k
本别代表新郎0,1,2的哑元变量,采取对这三个哑元变量进行赋值的方式遍历可能的结婚方式。在遍历的过程中,由于新浪i不能跟0号新娘结婚,所以i可以从1开始。
程序
1: /** 2: * @file 048c.c 3: * @author Chaolong Zhang <emacsun@163.com> 4: * @date Tue Jul 9 16:21:12 2013 5: * 6: * @brief 三对情侣结婚。新郎是A,B,C。新娘是X,Y,Z。有人不知道谁和谁结婚,于是询问了六个人中的三个。得到如下回复:A说他和X结婚,X说她的未婚夫是C,C说他将和Z结婚。这人听后确认这三个人都在开玩笑说假话,请你推断到底谁要和谁结婚。 7: * 8: * 9: */ 10: 11: 12: #include <stdio.h> 13: 14: int main(int argc, char *argv[]) 15: { 16: 17: for (int i = 1; i < 3; ++i){ 18: for (int j = 0; j < 3; ++j){ 19: for (int k = 0; k < 3; ++k){ 20: if (i==j || j==k || i==k || k==0 || k==2) ; 21: else printf ("i=%d,j=%d,k=%d ",i,j,k); 22: } 23: } 24: } 25: return 0; 26: }
输出结果
i=2,j=0,k=1
表明A新郎和Z新娘结婚,B新郎和X新娘结婚,C新郎和Y新娘结婚