看到这样一道算法题。
有个朋友说 二维数组可以解决,有个朋友说是 A*算法问题。
鉴于之前有过二维数组的操作,感觉还是比较繁琐的,我起初的想法是打算用对象来操作。思路大致如下
- 号码不能随便拨(有序性),所以只要算出两个数字之间的距离就好了。
2.能算出两个之间的距离,循环相加就好了。
在这个思路下 ,我列出了 一个1->所有数组的对象,观察他们距离之间的关系。发现其实还是二维数组的问题(需要知道 x轴和y轴上的偏移量 才能计算距离);
于是 我有个大胆的想法,写出一个函数(数学公式)直接求出两个数字之间的距离 。后来就写成下边的代码了:
function countAll(arr){
arr = arr.map(str=>{
if(str === '*') return 10;
if(str === 0) return 11;
if(str === '#') return 12;
return str
})
arr.unshift(5)
let num = 0;
for(let i = 0;i<arr.length-1;i++){
// console.log(count(arr[i],arr[i+1]),"xxx")
num += count(arr[i],arr[i+1])
}
return num;
}
function count (a,b){
if(a == b) return 0;
const aobj = position(a)
const bobj = position(b)
let ax = aobj.x;
let ay = aobj.y;
let bx = bobj.x;
let by = bobj.y;
return (Math.abs(ax-bx) + Math.abs(by-ay))
}
function position(a){
let x = a>3? Math.floor(a/3):0;
let y = a>3?(a%3):(a-1);
if(a>3){
if(y==0){
y=2;
x-=1;
}else{
y-=1
}
}
return {x,y}
}
- 经过几次测试和修改,发现达到了计算距离之和的目的。
- 只进行了简单测试,并没有深入测试,如果发现有不对的结果,请联系我。
本文为为数不多的原创,转载请注明出处,谢谢合作。