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

原创 2012年12月04日 23:21:14

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

题目

给定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 未经允许请勿用于商业用途)



黑马程序员——用二维数组打印螺旋方阵和螺旋矩阵

------- android培训、java培训、期待与您交流! ---------- ————————————————————————————————————————————————————————...
  • zz1017161726
  • zz1017161726
  • 2015年04月26日 15:42
  • 1593

打印螺旋矩阵(递归解法)

 求职过程遇到的一道面试题,当时没有做出来,回来想出几种方法,其中大多是“蛮力”解法,不得不陷入一堆的 i、j 循环之中。最后想出一种递归解法,现记录如下。题目如下:输入N, 打印 N*N 螺旋矩阵比...
  • BlackEagle_
  • BlackEagle_
  • 2006年02月22日 20:48
  • 10134

【练习1】输出一个螺旋数组,可以很好地理解数组和指针的使用

Input array size N (1~20) Using Two-Dimensional array 输入数组大小(1 - 20): 输出结果: 静态数组版: #include int ...
  • qq_27183003
  • qq_27183003
  • 2015年11月07日 08:54
  • 2033

黑马程序员-昨天研究一个通俗易懂的螺旋输出数组的算法,希望大家给点建议!!

需求:写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的 最外圈向内螺旋方式地顺序排列。...
  • u014185140
  • u014185140
  • 2016年06月24日 10:50
  • 943

螺旋数组

螺旋数组 最直观的方法是模拟这个顺时针转圈的过程 设数组维数为m 假设需要转m圈才可以覆盖整个shuzu 第一圈的元素个数为4*dim-4=4*(dim-1) 第二圈的元素个数为4*(dim-3) 即...
  • zhanglei0107
  • zhanglei0107
  • 2013年10月01日 11:51
  • 4181

顺时针打印二维数组(螺旋输出数组)

题目:给定一个数组,将该数组从第一个元素开始顺时针打印出来。分析:先考虑打印周围一圈的问题,然后可以使用递归求解,直到最后全都打印完为止。 代码如下:package problem2;/** * ...
  • hutongling
  • hutongling
  • 2017年03月19日 17:44
  • 1741

螺旋输出二维数组

  • 2013年11月11日 16:38
  • 12KB
  • 下载

打印螺旋数组

描述: 对于一个N*N的数组,输入一个小于 N*N的数n,螺旋打印该数组。例如:一个5*5的数组,输入25,打印如下图形: 1 2 3 4 5 16 17 18 19 6 15 2...
  • zhangjie121
  • zhangjie121
  • 2014年12月03日 15:34
  • 352

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

看到一个很简单的题目,很想小时候数学课本后面找规律的思考题。 题目 给定N打印如下数组: 解法一:循环N螺旋赋值 比较直观的思路是根据N来找规律。可以看到N为奇数时...
  • xiaowei_cqu
  • xiaowei_cqu
  • 2012年12月04日 23:21
  • 6261

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

看到一个很简单的题目,很想小时候数学课本后面找规律的思考题。 题目 给定N打印如下数组: 解法一:循环N螺旋赋值 比较直观的思路是根据N来找规律。可以看到N为奇数时,数组是逆时...
  • ocean0815
  • ocean0815
  • 2014年05月13日 23:21
  • 305
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【算法设计】打印螺旋数组
举报原因:
原因补充:

(最多只允许输入30个字)