【算法】关于拨电话的手指移动距离的计算

看到这样一道算法题。
有个朋友说 二维数组可以解决,有个朋友说是 A*算法问题。
鉴于之前有过二维数组的操作,感觉还是比较繁琐的,我起初的想法是打算用对象来操作。思路大致如下

  1. 号码不能随便拨(有序性),所以只要算出两个数字之间的距离就好了。

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}
			}
  • 经过几次测试和修改,发现达到了计算距离之和的目的。
  • 只进行了简单测试,并没有深入测试,如果发现有不对的结果,请联系我。

本文为为数不多的原创,转载请注明出处,谢谢合作。

原文地址:https://www.cnblogs.com/chengyunshen/p/10980801.html