`

数字绕圈算法 JS 实现

 
阅读更多

这是一道某公司的算法题,我们姑且称之为“数字绕圈算法”。

题目:给定一个数字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('');
}

 

  • 大小: 5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics