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


    看到这样一道算法题。
    有个朋友说 二维数组可以解决,有个朋友说是 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}
    			}
    
    • 经过几次测试和修改,发现达到了计算距离之和的目的。
    • 只进行了简单测试,并没有深入测试,如果发现有不对的结果,请联系我。

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

  • 相关阅读:
    快速提取某一文件夹下所有文件名称
    CFileFind类的使用总结
    FILE文件流的中fopen、fread、fseek、fclose的使用
    经典损失函数:交叉熵(附tensorflow)
    tensorboard使用
    Windows下 tensorboard出现ValueError:Invalid format string
    新建全色或者resize(毫无价值,只是做记录)
    创建一个任意大小的全色矩阵 python
    转移图片位置
    getpatch
  • 原文地址:https://www.cnblogs.com/chengyunshen/p/10980801.html
Copyright © 2020-2023  润新知