题目大意:
有蛇形数组,规律如下:
1 2 3
8 9 4
7 6 5
亦如:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
就是说,转着圈写正方形数字,像蛇盘旋一样。
要求实现:依次打印出每排的数字。如前,需要打印 1 2 3 8 9 4 7 6 5.
我的思路:
我估计一般人还是会从用二维数组来考虑吧,比如说我。比如输入3,,就应该对应一个3*3的二维数组:[[1,2,3],[8,9,4],[7,6,5]],这样的话一次打印就很好输出了。
关键是,如何知道二维数组的那一项对应哪个数字呢?arr[0][0]对应1,任意arr[i][j]对应哪一个呢?
我是按着它的这个蛇形规律去思考的。数字是逐步递增的,从1到n*n。先从左上角开始,然后向右赋值,再向下,再向左,再向上,完成一个轮回。里面的赋值一样也是这个顺序,我将每一圈赋值看作一个周期,如果传入4,我需要赋值2圈,如果传入5,我需要赋值3圈(虽然最后一圈仅仅赋值一个数字,也可当作一个轮回)。如图:
功能实现:
function main(n){
//给每一个轮回去赋值,赋值到二维数组
//定义二维数组
var arr = [];
for(var i=0;i<n;i++){
arr[i] = [];
}
//定义值x,每次递增1
var x=1;
var r = Math.ceil(n/2); //需要循环的次数
for(var d=0;d<r;d++){
test(n-d); //给二维数组的每一个位置赋值
}
function test(m){
//m为从边长递减至循环结束的值,如当n=5时,m可取值5,4,3
for(var i=n-m,j=n-m;j<m;j++){ arr[i][j] = x++; } //上边赋值
for(var i=n-m+1,j=m-1;i<m;i++){ arr[i][j] = x++; } //右边
for(var i=m-1,j=m-2;j>=n-m;j--){ arr[i][j] = x++; } //下边
for(var i=m-2,j=n-m;i>n-m;i--){ arr[i][j] = x++; } //左边
}
//打印最后结果
for(var i=0;i<arr.length;i++){
for(var j=0;j<arr[i].length;j++){
//console.log(arr[i][j]);
}
console.log(arr[i]); //为了方便查看,直接打出每个数组
}
}
================================================================
许祥记于2016校园秋招