`
bcyy
  • 浏览: 1818383 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

题目

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



分享到:
评论

相关推荐

    螺旋打印任意二维数组

    该算法可以螺旋打印二维数组a[M][N],即,先打印第一行,然后打印最右边的一列,然后打印最下面的那一行,从右往左打印,接着打印最左边的那一列,从下往上打印。这样最外面的一圈打印完了,接着打印里面的一圈,按照...

    二维数组螺旋遍历.zip

    用C++实现将数组中元素以螺旋状顺序打印出来,包含代码以及介绍文档

    螺旋方阵算法

    将螺旋方阵存放到N×N的二维数组中并把它打印输出。要求程序自动生成下图所示螺旋方阵。用 #defined定义常量N,要求对N进行更改也能达到相同的效果。 1 16 15 14 13 2 17 24 23 12 3 18 25 22 11 4 19 20 21 10 5 6 ...

    Python实现打印螺旋矩阵功能的方法

    本文实例讲述了Python实现打印螺旋矩阵功能的方法。分享给大家供大家参考,具体如下: 一、问题描述 输入N, 打印 N*N 螺旋矩阵 比如 N = 3,打印: 1 2 3 8 9 4 7 6 5 N = 4,打印: 1 2 3 4 12 13 14 5 11 16...

    leetcode中文版-Algorithms_Of_Interview:计算机视觉算法工程师面试中手撕代码的算法题总结

    3.螺旋打印二维数组(头条) 4.删除字符(第四范式) abcdabcd 4 bcdabcd bcdbcd cdbcd cdcd 5.螺旋三角形(第四范式) 5 1 2 12 3 13 11 4 14 15 10 5 6 7 8 9 6.二叉树的深度 7.排序 快排,归并,堆排序 8.二叉树路径...

    C 打印输出旋转方阵.rar

    C 打印输出旋转方阵,其中螺旋方阵形式如下,类似矩阵:   1 12 11 10   2 13 16 9   3 14 15 8   4 5 6 7  设row,column分别代表行、列坐标,变量p从1到n2将p依次存入数组a[row][column]中,要确定row、...

    扩展矩阵leetcode-DsAlgo:数据结构和算法实践

    矩阵的螺旋顺序 在数组中实现 K 个堆栈 查找数组中缺失的数字 在排序数组中搜索,列表继续。 链表 像数组一样,链表也是一种线性数据结构,只是它的元素不存储在连续的位置。 以下是我尝试过的一些问题,并针对 ...

    LeetCode解题总结

    LeetCode解题总结 ...15.8.1 螺旋打印矩阵 15.8.2 生成螺旋矩阵 15.9 Z字形输出字符串 15.10 不使用乘、除、取模实现两个整数相除 15.11 文本对齐 15.12 共线的最大点数 16 其他问题 16.1 随机数生成器

    leetcode63-LeetCode-Cpp:C++版本的LeetCode算法

    顺时针打印螺旋矩阵方阵】 sort topic 1. 2. 3. 4. 5. 6. 7. 8. 9. binary-search topic 1. 【有序数据中,查找等于target的index左右边界】 2. 【有序数组查找目标值的index。如果目标值不存在于数组中,返回它将会...

    javalruleetcode-Leetcode:LeetCode、Swordoffer、数据结构、算法的编程题

    螺旋矩阵 lc.88.合并两个有序数组 1.2 链表 题目 备注 进度 so.3.从尾到头打印链表 so.14.链表中倒数第k个结点 so.15.反转链表 so.16.合并两个排序的链表 so.25.复杂链表的复制 so.36.两个链表的第一个公共结点 so....

    JavaScript-Algorithms:JavaScript算法

    JavaScript算法 JavaScript算法 内容 -&gt;不使用内置数组方法的字符串反转 -&gt;回文检查 -&gt;查找数组中的最大连续1 ...-&gt;打印步骤 -&gt;印刷金字塔 -&gt;找到元音 -&gt;输入矩阵螺旋 -&gt;斐波那契 -&gt;记忆 -&gt;排队编织 -&gt;与堆栈队列

    C程序范例宝典(基础代码详解)

    实例172 打印n阶螺旋方阵 247 5.5 生活中的数学 249 实例173 求车运行速度 249 实例174 卖西瓜 250 实例175 打渔晒网问题 251 实例176 水池注水问题 252 实例177 捕鱼和分鱼问题 253 实例178 递归解...

    leetcode2sumc-CipherSchools_Assignment:ciphershcoll和讲座代码的所有分配

    以螺旋形式打印给定矩阵(中) 按行和按列排序的二维数组中的第 K 个最小元素 | 设置 1(硬) 最大和连续子阵列(中) 铁路/汽车站所需的最少站台数量(中) 找到丢失的数字(简单) 合并两个已排序的数组(简单) ...

    Introduction_to_algorithm:实施书

    Introduction_to_algorithm 《算法简介》实现书 内容(仍在增长) 单链表 堆和堆排序 合并排序 AVL树和AVL排序 Knuth-Morris-Pratt(KMP)算法 ...螺旋矩阵打印 θ(logn)大指数算法 O(1)Febonacci算法

    Matrix_Spiral_Clockwise

    任务 : 编写一个程序,该程序以顺时针螺旋顺序打印/返回2D矩阵的元素。抽象的: 就性能而言,编写短代码并不总是意味着它是高质量的代码。 同样,编写更长的代码并不意味着它是不好的代码! Numpy数组由于其同质...

Global site tag (gtag.js) - Google Analytics