现在的位置: 首页 > 综合 > 正文

【算法设计】打印螺旋数组

2013年10月09日 ⁄ 综合 ⁄ 共 1147字 ⁄ 字号 评论关闭

看到一个很简单的题目,很想小时候数学课本后面找规律的思考题。

题目

给定N打印如下数组:

解法一:循环N螺旋赋值

比较直观的思路是根据N来找规律。可以看到N为奇数时,数组是逆时针循环赋值;N为偶数时,顺时针。如下图所示:

所以在最外层循环N,很容易写出代码:

	int n=0;cin>>n;
	vector<vector<int> > T(n,vector<int>(n,0));
	int num=0;
	for(int k=1;k<=n;k++){
		//奇数时逆时针赋值
		if(k%2==1){
			for(int j=0;j<k;j++)
				T[k-1][j]=++num;
			for(int i=k-2;i>-1;i--)
				T[i][k-1]=++num;
		}
		//偶数时顺时针赋值
		else{
			for(int i=0;i<k;i++)
				T[i][k-1]=++num;
			for(int j=k-2;j>-1;j--)
				T[k-1][j]=++num;
		}
	}

解法二:直接找数组规律

仔细观测数组,发现数组可以分为上下两个三角。在上三角中,数组纵坐标小于等于横坐标,数组纵向连续;下三角中,横坐标小于等于纵坐标,数组横向连续。

上三角:

上三角中,暗纵坐标的奇偶性分为两种情况。
  • 纵坐标为奇数时,T[1][i]=i*i,即上图中第1,3,5列第一个元素分别为1,9,25。每列由上至下递减,即第3列3个元素分别为9,8,7.
  • 纵坐标为偶数时,T[1][i]=(i-1)*(i-1)+1,即上图中第2,4,6列第一个元素分别为1+1=2,9+1=10,25+1=26。每列由上至下递增,即第4列4个元素分别为10,11,12,13.

上三角:

下三角中,按横坐标的奇偶性分为两种情况:
  • 横坐标为偶数时,T[i][1]=i*i,即上图中第2,4,6行第一个元素分别为4,16,36。每行由左至右递减,即第4行3个元素分别为16,15,14.
  • 横坐标为奇数时,T[i][1]=(i-1)*(i-1)+1,即上图中第3,5行第一个元素分别为4+1=5,16+1=17。每行由左至右递增,即第5行4个元素分别为17,18,19,20.
代码如下:
	int n=0;cin>>n;
	vector<vector<int> > T(n,vector<int>(n,0));
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(j>=i){
				if(j%2==0)
					T[i][j]=(j+1)*(j+1)-i;
				else
					T[i][j]=j*j+i+1;
			}
			else{
				if(i%2==1)
					T[i][j]=(i+1)*(i+1)-j;
				else
					T[i][j]=i*i+j+1;
			}
		}
	}

(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)

抱歉!评论已关闭.