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