使用JS代码生成螺旋数组

1、生成顺时针螺旋数组。

输入数字n,生成n行n列的螺旋数组,例如

n=1,输出

1;

n=2,输出

1 2

4 3

n=3,输出

1 2 3

8 9 4

7 6 5 

……

代码1:思路:首先声明一个二维数组,然后对数组从最外圈到最内圈依次赋值。

function spiralArray(n){
	var m=0;
	var a=1;
	var arr=[];
	for(var i=0;i<n;i++){
		arr[i]=new Array();
		for(var j=0;j<n;j++){
			arr[i][j]=n*n;//当n为偶数时,下面的循环无法给中间的项赋值,所以初始为n*n
		}
	}
		
	while(m<n/2){
	//向右赋值
	for(var i=m;i<n-m-1;i++){
		arr[m][i]=a++;
		
	}
	//向下赋值
	for(var i=m;i<n-m-1;i++){
		arr[i][n-m-1]=a++;
	}
	//向左赋值
	for(var i=m;i<n-m-1;i++){
		arr[n-m-1][n-l-i]=a++;		
	}
	//向上赋值
	for(var i=m;i<n-m-1;i++){
		arr[n-i-1][m]=a++;
	}	
	m=m+1;//m=0时为最外圈赋值,每循环一次进行缩圈,则m+1
	
	}
	return arr;
}
	
	console.log(spiralArray(8));

当n=8时,结果如下

上述代码当n为奇数时,sprialArray函数访问不到数组中间那项,代码中通过将数组的初始值设为n*n解决这个问题。代码2则对sprialArray函数进行了修改,解决了这一问题。

代码2:解决当n为奇数上述代码sprialArray函数无法为数组中间项赋值的问题

  function sprialArray(n){
	var m=0;
	var a=1;
	var arr=[];
	for(var i=0;i<n;i++){
		arr[i]=new Array();
		for(var j=0;j<n;j++){
			arr[i][j]=0;
		}
	}
		
	while(m<n/2){
	//向右赋值,当n为奇数时,最后一次循环为数组中间项赋值
	for(var r=m;r<n-m;r++){
		arr[m][r]=a++;
		
	}
	//向下
	for(var d=m;d<n-m-1;d++){
		arr[d+1][n-m-1]=a++;
	}
	//向左
	for(var z=m;z<n-m-1;z++){
		arr[n-m-1][n-1-(z+1)]=a++;
		
	}
	//向上
	for(var u=m;u<n-m-2;u++){
		arr[n-(u+1)-1][m]=a++;
	}
	
	m=m+1;//m=0时为最外圈赋值,每循环一次进行缩圈,则m+1
	
	}
	return arr;
}
	
	console.log(sprialArray(8));

2、生成逆时针螺旋数组,并且数值递减。思路上述代码相同。只是改变赋值顺序。

例如,n=0,输出

1

n=1,输出

7 8 9

6 1 2

5 4 3

n=2,输出

21 22 23 24 25

20  7   8   9  10

19   6   1   2  11

18   5   4   3  12

17  15 15 14 13

 function sprialArray(num){
	var n=2*num+1;
	var m=0;
	var a=n*n;
	var arr=[];
	for(var i=0;i<n;i++){
		arr[i]=new Array();
		for(var j=0;j<n;j++){
			arr[i][j]=1;//当n为偶数时,下面的循环无法给中间的项赋值所以初始为n*n
		}
	}
		
	while(m<n/2+1){
	//向左
	for(var z=m;z<n-m-1;z++){
		arr[m][n-1-z]=a--;
		
		
	}
	//向下
	for(var d=m;d<n-m-1;d++){
		arr[d][m]=a--;
		
	}
	//向右
	for(var r=m;r<n-m-1;r++){
		arr[n-m-1][r]=a--;
		
	}
	//向上
	for(var u=m;u<n-m-1;u++){
		arr[n-u-1][n-m-1]=a--;
		
	}
	
	m=m+1;//m=0时为最外圈赋值,每循环一次进行缩圈,则m+1
	
	}
	return arr;
}
	
	console.log(sprialArray(3));
当n=3时,结果如下。
 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值