js版本水杯10/7/3

/*群里发的小学二年级题目,花了一个半小时才写出来,
[    [10,0,0],    [3,7,0],    [3,4,3],    [6,4,0],    [6,1,3],
     [9,1,0],     [9,0,1],    [2,7,1],    [2,5,3],    [5,5,0]            ]*/

//把b数组i的水倒入j,如果i没水或者j满了返回undefinde,否则返回新b数组
function f(b,i,j){					
    var k=m[j]-b[j]
    if(b[i]>0&&k>0){
        k=Math.min(b[i],k)
        b[i]=b[i]-k
        b[j]=b[j]+k
        return b
    }
}

var fromto=[[0,1],[1,0],[2,0],[0,2],[1,2],[2,1]]
let big=10
let offset=2
let needSize=big/2
var m=[big,needSize+offset,needSize-offset]

var a=[big,0,0]
var ways=[]
var waysStr=JSON.stringify(a)
var way=[]
way.push(a)
ways.push(way)


do{
    way=ways.shift()
    if(way==undefined){break}
    var prev=way[way.length-1]
    for(let ft in fromto){
        let i=fromto[ft][0]
        let j=fromto[ft][1]
        let wayTemp=JSON.parse(JSON.stringify(way))
        let prevTemp=JSON.parse(JSON.stringify(prev))
        let cur=f(prevTemp,i,j)
        //console.log(prevTemp,i,j,cur)
        if(cur!=undefined){
            let strTmp=JSON.stringify(cur)
            if(waysStr.indexOf(strTmp)==-1){
                waysStr=waysStr+strTmp+","
                wayTemp.push(cur)
                ways.push(wayTemp)
            }
        }
    }
    //console.log(ways)

}while(prev[0]!=needSize||prev[1]!=needSize)
console.log(way)

方法2:

//把b数组i的水倒入j,如果i没水或者j满了返回undefinde,否则返回新b数组
//用字符串为key的map减少空间消耗,不用map可以考虑用数组,用hash函数把数组换算成integer作数组的索引
function f(b,i,j){                    
    var k=m[j]-b[j]
    if(b[i]>0&&k>0){
        k=Math.min(b[i],k)
        b[i]=b[i]-k
        b[j]=b[j]+k
    }
    return b
}

var fromto=[[0,1],[1,0],[2,0],[0,2],[1,2],[2,1]]
let big=10
let offset=2
let needSize=big/2
var m=[big,needSize+offset,needSize-offset]

var a=[big,0,0]
var ways={}
var queue=[a]
var res=false
ways[JSON.stringify(a)]=false


while(!res){
    way=queue.shift()
    for(let ft in fromto){
        let i=fromto[ft][0]
        let j=fromto[ft][1]
        let s_way=JSON.stringify(way)
        let nextWay=f(JSON.parse(s_way),i,j)
        let s_nextWay=JSON.stringify(nextWay)
        if(ways[s_nextWay]!=undefined){continue}
        ways[s_nextWay]=s_way
        
        if(nextWay[0]==needSize&&nextWay[1]==needSize){
            res=s_nextWay
            break
        }
        queue.push(nextWay)
        console.log(nextWay,needSize)
    }
}
console.log(ways)
while(res){
    console.log(res)
    res=ways[res]
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值