╃小〥斌╄
二十三年春秋梦,一朝秋雨人初醒。 几曾磨剑图破壁,而今励志待明朝。 莫道红颜无我辈,古来坦途有几人? 英雄何惧前途路,丈夫岂会不腾达!
posts - 291,comments - 628,trackbacks - 8
原文 : http://www.cnblogs.com/lxinxuan/archive/2007/08/29/874966.html

引文如下 :

有A、B、C、D四个人,他们各说了两句话:
A说:
     1)我是在B之前一位到达(举例:比如,B第二位到达,那么A就是第一位,下同)
     2)我不是第一名到达的
B说:
     1)我是在C之前一位到达
     2)我不是第二名到达的
C说:
     1)我是在D之前一位到达
     2)我不是第三名到达的
D说:
     1)我是在A之前一位到达
     2)我不是第四名到达的

其中:1)只有两句话是真的,但不一定是同一个人说的,其余六句话都是假的;
            2)第一名的那个人说了一句真话。(是否只说了一句真话,还是两句都是真话?不得而知)

求:A、B、C、D四个人的到达顺序。

1) 思路 : 

1,把8个问题转化成表达式
function p( a , b) { return a == (b - 1)? 1 : 0 }
function q ( c , d ) { return c != d ? 1 : 0; }

2,从结果出发, 找出4个人先后顺序的排列组合
var man = {A:1,B:2,C:3,D:4};

3,  把八个问题的结果 按照1,0  相加 如果结果为2 并且第一的人至少有1个是1的话为正解

2) 代码 :

 function count() {
  
   var man = {A:1,B:2,C:3,D:4};
   
   var listResult = makeKN();
   
   var result = [];
   var resultStr = "";
    
   for (var i = 0 , n = listResult.length ; i < n ;  i ++ ) {
   
    man.A = listResult[i][0];
    man.B = listResult[i][1];
    man.C = listResult[i][2];
    man.D = listResult[i][3];
    
   
   
    var A1 = p(man.A , man.B );
    var A2 = q(man.A , 1);
    var B1 = p(man.B , man.C );
    var B2 = q(man.B , 2);
    var C1 = p(man.C , man.D );
    var C2 = q(man.C , 3);
    var D1 = p(man.D , man.A );
    var D2 = q(man.D , 4);
    
    var resultNum = (A1 + A2 + B1 + B2 + C1 + C2 + D1 + D2);
    
    if ( resultNum == 2 ) {
     
     if (k(A1 , A2 , man.A) || k(B1 , B2 , man.B) || k(C1 , C2 , man.C) || k(D1 , D2 , man.D)) {
      resultStr = "result" + (result.length + 1) + ":" + "A:" + man.A + ",B:" + man.B + ",C:" + man.C + ",D:" + man.D;
      result.push(resultStr);
     }
     
    } 
   }
   
   document.getElementById("result").innerHTML = result.join("<br>");
   
  }
  
  function p( a , b) {
   return a == (b - 1)? 1 : 0
  }
   
  function q ( c , d ) {
   return c != d ? 1 : 0;
  }
  
  function k( a , b , c) {
   
   return (c == 1) && (a + b > 0);
  }
  
  function makeKN() {
   
   var list = [];
   var listResult = [];
 
   for ( var i = 1 ; i < 5 ; i ++) {
    for ( var j = 1 ; j < 5 ; j ++) {
     for ( var p = 1 ; p < 5 ; p ++) {
      for ( var q = 1 ; q < 5 ; q ++) {
       
       if ( i != j && i != p && i != q
        && j != p && j != q
        && p != q ) {
     
        list[0] = i;
        list[1] = j;
        list[2] = p;
        list[3] = q;
        
        listResult.push(list);
        list = [];
       } 
      }
     }
    }
   }
   return listResult;
  }  
  
3) 结果
result1:A:3,B:2,C:1,D:4

Author by : ╃小〥斌╄
URL :  http://www.cnblogs.com/seagate_cn/archive/2007/08/31/876984.html
不足之处还请指教,  继续修改优化中。。。。
posted on 2007-08-31 11:26 ╃小〥斌╄ 阅读(355) 评论(4)  编辑 收藏 所属分类: JS专栏

FeedBack:
2007-08-31 12:54 | ColdDog      
太强了,~~~呵呵,思路其实都一样的。
我是用c#(从建模角度出发)实现的,我一个同事用c语言(注重算法)也实现了,其实都一样的 ,我们也可以对比一下哪些语言实现起来比较容易,或者容易读懂。
  回复  引用  查看    
2007-08-31 14:33 | 560889223 [未注册用户]
搜索?
貌似我见过一个类似的题目,当时在《电脑报》上出的,看到有个人用一堆布尔运算解决的……貌似是这样的……
  回复  引用    
#3楼 [楼主]
2007-08-31 14:49 | ╃小〥斌╄      
@ColdDog
其实这里用到的算法也不多, 方法是多样的 。 我也是中午有时间就写了。

  回复  引用  查看    
2007-09-05 13:51 | winnerzone      
呵呵,算法的问题.
  回复  引用  查看    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-08-31 16:40 编辑过
 
另存  打印