这是一道某公司的算法题,我们姑且称之为“数字绕圈算法”。
题目:给定一个数字N,以此生成一个N^2的二维矩阵,以某个方向为基准从1开始填充数字。假设数字5那么开始绕圈,最终的结果显示为:
1 16 15 14 13
2 17 24 23 12
3 18 25 22 11
4 19 20 21 10
5 6 7 8 9
代码如下:
var num = 3, res; // 定义全局变量 document.getElementById('btn').onclick = function(){ num = parseInt(document.getElementById('num').value) || num; res = []; for(var i =0;i<num; i++){ res[i] = []; for(var v=0;v<num;v++) res[i][v] = ''; } calc(num); print(); } //递归的算法 var calc = function(n, r){ r = r || 0; // 圈数 var x=y=0, // 初始化坐标 start = r, // 开始位置 end = n-1, // 结束位置 startNum= !r ? 1 : n * 4 * r +1; //显示的数字 // 奇数情况下判断是否是最后一个数字 if (start==end){ res[start][start] = Math.pow(num,2); return; } // 四个方向填充 for(x=start; x<end; x++){ res[x][r] = startNum++; } for(y=start; y<end; y++){ res[x][y] = startNum++; } for(; x>r; x--){ res[x][y] = startNum++; } for(; y>r; y--){ res[x][y] = startNum++; } // 偶数情况下判断判断完结 if ( x>Math.ceil(n/2)){ return; } calc(--n, ++r); } //显示结果 var resDiv = document.getElementById('res'); var print = function(){ var str = []; for(var i in res){ for(var m in res[i]){ str.push('<div>', res[i][m], '</div>'); } str.push('<br/>'); } resDiv.innerHTML = str.join(''); }