`

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

 
阅读更多

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

题目

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


 

 

分享到:
评论

相关推荐

    C++螺旋数组

    在实际编程中,可能会遇到更复杂的情况,例如,输入的不是固定大小的矩阵,而是动态大小的二维数组,或者需要填充而不是仅打印螺旋数组。这时,你需要使用动态内存分配(如`new`运算符)来创建二维数组,并调整填充...

    C++语言写的螺旋数组

    这将展示如何用C++实现螺旋数组的打印功能。 此外,还可以扩展这个程序,添加读取用户输入的功能,或者修改为动态生成大小的螺旋数组。还可以增加其他功能,比如生成螺旋数组、反转螺旋数组、查找特定元素等,这些...

    螺旋的方式打印二维数组

    结合这两个功能,我们可以轻松地测试螺旋打印算法,无需手动输入大型二维数组。这提高了代码测试的效率和可维护性。 总的来说,螺旋打印二维数组和自动生成二维数组是编程中实用的技巧,它们可以帮助我们更有效地...

    螺旋打印任意二维数组

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

    打印螺旋矩阵(C语言实现)

    螺旋矩阵,也称为螺旋顺序,是一种特殊的矩阵排列方式,它从矩阵的最外层开始,按照顺时针方向逐层填充元素。...在实践中,你还可以尝试优化代码,例如,使用更高效的数据结构或算法来实现螺旋矩阵。

    二维数组螺旋遍历.zip

    这个函数接受一个二维数组和它的行数`m`和列数`n`作为参数,然后按照螺旋顺序打印数组的元素。注意,为了处理数组边缘情况,我们需要在每次遍历完一个边界后检查是否还有剩余的部分可以遍历。 这个经典算法面试题...

    基于c语言编写螺旋方阵

    // 打印螺旋方阵 } ``` **程序解析**: - 定义了一个大小为5x5的二维数组`arr`。 - 通过嵌套循环依次填充每个边界,并更新数组中的值。 - 最后打印生成的螺旋方阵。 #### 版本三 ```c #define N 5 #define down ...

    螺旋式遍历二维数组(矩阵)Demo

    接下来,我们将设计一个算法来实现螺旋遍历。以下是一个简单的Java实现,即`SpiralMatrix.java`文件可能包含的代码: ```java public class SpiralMatrix { public static void spiralPrint(int[][] matrix) { if...

    内螺旋矩阵算法

    内螺旋矩阵算法是一种在二维数组中填充数字的特殊方式,其特点是数字按顺时针方向从数组中心向外螺旋式地填充。这种填充模式在数据结构和算法的学习中颇为有趣,因为它涉及到了数组的操作以及对角线元素的处理。在...

    打印螺旋上三角(C语言实现)

    4. **螺旋打印算法**: - 初始化四个边界变量:`top`(上边界),`bottom`(下边界),`left`(左边界)和`right`(右边界)。它们分别初始化为0和数组的宽度减1。 - 使用一个主循环,只要`top 且`left ,就执行...

    xunhuan.rar_循环数组

    8. **输出结果**:最后,可以通过遍历整个二维数组并打印其内容,以展示生成的螺旋数组。 在提供的压缩包文件中,"text1_xunhuan.c"很可能是实现螺旋数组生成的源代码文件,而".dsp", ".dsw", ".ncb", ".opt", 和 ...

    第7章 数组-2数组元素的访问及螺旋矩阵-简化1

    在C语言程序设计中,数组是一种非常基础且重要的数据结构,用于存储同...理解这些概念对于C语言的编程至关重要,因为它们涉及到基本的数据组织和算法设计。学习这些内容有助于提升编程能力,特别是在处理大型数据集时。

    任意数字螺旋矩阵打印

    螺旋矩阵是一种特殊的二维数组,它的元素按照特定的螺旋顺序排列。在给定的场景中,我们需要实现一个程序,能够根据用户...这种问题在算法设计和数据结构的学习中很常见,有助于锻炼对二维数组的操作和逻辑控制的理解。

    打印螺旋矩阵

    打印螺旋矩阵是编程中的一个经典问题,它涉及到数组操作和循环控制。在本问题中,我们需要创建一个M*N的螺旋矩阵,并进行打印。同时,题目还提到了计算N*N矩阵的行列式的值,这是一个线性代数中的概念。 首先,让...

    Java实现顺时针输出螺旋二维数组的方法示例

    首先,我们需要理解螺旋数组的规律。螺旋数组从左上角开始,沿着顺时针方向依次填充数字。当一行或一列填满后,数组的遍历会转向下一圈。例如,对于5x5的数组,其初始状态如下: ``` 1 2 3 4 5 16 17 18 19 6 15 24...

    算法实例之一--螺旋矩阵VB程序

    根据给定文件的信息,我们可以提炼出以下...这种类型的编程问题有助于提高编程者的逻辑思维能力和算法设计能力。对于初学者而言,这是一个很好的练习项目,可以帮助他们更好地掌握VB语言中的各种控制结构和数据结构。

    php-leetcode题解之二维数组回形排序打印.zip

    在本压缩包“php-leetcode题解之二维数组回形排序打印.zip”中,主要包含的是使用PHP语言解决LeetCode算法问题的相关代码和解析,特别是关于二维数组的回形顺序打印。LeetCode是一个在线的编程练习平台,它提供了...

    趣味矩阵算法实现源代码

    "趣味矩阵"这个概念可能指的是那些具有特殊打印模式或者规律的矩阵,例如螺旋矩阵、对角线矩阵等。这类问题通常旨在增强对矩阵操作的理解,同时也能增加编程的乐趣。 标题中的“趣味矩阵算法实现源代码”意味着我们...

Global site tag (gtag.js) - Google Analytics