前端智勇大冲关-第四关-12小球称重问题

有关前端智勇大冲关已给出了前三道题的解答,开始给出第四道题的解答,可能会有些出入,仅供大家的参考与学习。如果有误,请大家帮忙更正,谢谢。

balls[]   定义长度为12的数组
status   定义小球的轻重状态   -1代表轻   0代表正常  1代表重

随机生成-1或1两种状态的一种,并随机放在balls数组中,并记录这个坏球在数组中的位置

下面是我给出了一个简单的模拟示例。

简单模拟测试:

假如   mStatusType = -1;   坏球为轻

         mBallPos = 3;  坏球的位置放在第四个

         leftBalls = [0,1,2,3];   记录位置,分别是1,2,3,4这几个球

         rightBalls = [4,5,6,7];  记录位置,分别是5,6,7,8这几个球

调用   resultMsg(leftBalls,rightBalls);

 

    var balls =new Array();  // 存储小球
    var status = [-1,1];     // -1表示轻   1表示重
    var mStatusNum = parseInt(Math.random()*2);  // 随机生成0或1
    var mBallPos = parseInt(Math.random()*12);   // 坏球的位置
    var mStatusType = status[mStatusNum];   // 坏球轻重信息
    var leftBalls = new Array();  // 称左边包含的球
    var rightBalls = new Array(); // 称右边包含的球
            
    /**
     *函数initBalls初始化这组12个小球
     */
    function initBalls(){
        for(var i=0;i<12;i++){
            if(i===mBallPos){
                balls[i]=mStatusType;
            }
            else{
                balls[i]=0;
            }
        }
    }
            
    /**
     *函数isBall判断是否含有坏球,有返回true,无反回false
     *参数arr指数组,指数组,称的一边包含的球
     *参数mpos指坏球的位置
     */
    function isBall(arr,mpos){   
        for(var i=0,j=arr.length;i<j;i++){
            if(arr[i]===mpos){
                return true;
            }
        }
        return false;
    }
            
    /**
     * 函数resultMsg显示结果,返回string类型提示轻重信息
     * 参数leftBalls指数组,代表称中左边球
     * 参数rightBalls指数组,代表称中右边球
     */
    function resultMsg(leftBalls,rightBalls){
        if(leftBalls.length>rightBalls.length){  //那边球多那边重
            console.log("左边比右边重");
        }
        else if(leftBalls.length<rightBalls.length){
            console.log("左边比右边轻");
        }
        else{    //那边含有坏球(根据位置判断),并根据-1或1判断或轻或重
            if(!isBall(leftBalls,mBallPos)&&!isBall(rightBalls,mBallPos)){
                console.log("左右两边一样重");
            }
            else if(isBall(leftBalls,mBallPos)){
                if(mStatusType===-1){
                    console.log("左边比右边轻")
                }
                else{
                    console.log("左边比右边重");
                }
            }
            else if(isBall(rightBalls,mBallPos)){
                if(mStatusType===-1){
                    console.log("左边比右边重")
                }
                else{
                    console.log("左边比右边轻");
                }
            }
        }
    }


关于逆推请参考
有12个小球,有一个质量和其它十一个不一样,不知道是重还是轻。用一个天秤称三次,把这个质量不同的球给区别出来(来源:12小球称重问题)
将12个小球编号 1~C
1 对比 1234 & 5678
  1.1 1234 = 5678,则坏球在9ABC中,第二次称 1239 & 56AB
    1.1.1 1239 = 56AB,则坏球是C
    1.1.2 1239 > 56AB,则坏球在9AB中,且 9 > AB 第三次称 A & B
      1.1.2.1 A = B, 坏球是9, 9偏重
      1.1.2.2 A > B, 坏球是B, B偏轻
      1.1.2.3 A < B, 坏球是A, A偏轻
    1.1.3 1239 < 56AB,则坏球在9AB中, 且 9 < AB 第三次称 A & B
      1.1.3.1 A = B, 坏球是9, 9偏轻
      1.1.3.2 A > B, 坏球是A, A偏重
      1.1.3.3 A < B, 坏球是B, B偏重
  1.2 1234 > 5678, 则坏球在1~8中,且要么1234中有偏重的坏球,要么5678中有偏轻的坏球,称 2345 & ABC1
    1.2.1 2345 = ABC1,则坏球在678中,第三次称 6 & 7
      1.2.1.1 6 = 7, 则坏球是8,8偏轻
      1.2.1.2 6 > 7,则坏球是7, 7偏轻
      1.2.1.3 6 < 7, 则坏球是6, 6偏轻
    1.2.2 2345 > ABC1,则坏球在234中,因为如果234是正常,说明 5 > 1,显然1.2 1234 > 5678 不成立,第三次称 2 & 3
      1.2.2.1 2 = 3, 4是坏球,4偏重
      1.2.2.2 2 > 3, 2是坏球,2偏重
      1.2.2.3 2 < 3, 3是坏球,3偏重
    1.2.3 2345 < ABC1,说明坏球在51中,因为如果51正常,说明 234 < ABC ,显然 1.2 1234 > 5678不成立,克制 5 < 1,第三次称1 & A
      1.2.3.1 1 = A,坏球是5,5偏轻
      1.2.3.2 1 > A,坏球是1,1偏重
      1.2.3.3 1 < A,此情况不存在
  1.3 1234 < 5678,判断方法同1.2

posted @ 2012-09-16 23:24  前端咖  阅读(2350)  评论(1编辑  收藏  举报