/*群里发的小学二年级题目,花了一个半小时才写出来,
[ [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]
}