这是一道某公司的算法题,我们姑且称之为“数字绕圈算法”。
题目:给定一个数字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('');
}

本文介绍了一种名为“数字绕圈算法”的实现方法,该算法根据输入数字N生成一个N^2的矩阵,并按特定顺序填充数字。文章提供了JavaScript代码示例,展示了如何通过递归方式填充矩阵。
3723

被折叠的 条评论
为什么被折叠?



