100c之48:新郎与新娘

问题

三对情侣结婚。新郎是A,B,C。新娘是X,Y,Z。有人不知道谁和谁结婚,于是询问了六个人中的三个。得到如下回复:A说他和X结婚,X说她的未婚夫是C,C说他将和Z结婚。这人听后确认这三个人都在开玩笑说假话,请你推断到底谁要和谁结婚。

分析

假设新郎新娘分别编号0,1,2。按照题目要求,有一下隐含条件:

  1. 1) 新郎之间不能结婚,新娘之间也不能结婚( 在这里,婚姻只限于男女之间)
  2. 2) 一个新郎只能取一个新娘,而且一个新娘也只能嫁一个新郎。
  3. 3) 0号新郎不能跟0号新娘结婚;
  4. 4) 2号新郎不能跟0号新娘结婚;
  5. 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\n",i,j,k);
22:              }
23:          }
24:      }
25:      return 0;
26:  }

输出结果

i=2,j=0,k=1

表明A新郎和Z新娘结婚,B新郎和X新娘结婚,C新郎和Y新娘结婚

posted @ 2013-07-09 19:27  emacsun  阅读(267)  评论(0编辑  收藏  举报