蛇形矩阵与螺旋矩阵

自己写的蛇形矩阵:(蛇形矩阵就是在NXN矩阵格子上从左上到右下以“之”字型增加或减少,像蛇盘绕着的形状。本程序从左上开始盘旋一直到右下达到最大值)

#include <iostream>
using namespace std;
#define n 10//输入要更改的矩阵大小
void main()
{
	int a[n][n]={0},k=1,j=0,i=0,s1[4]={0,1,2,3},t1[4]={1,1,2,2},m=0;
	for (int t=1;t<=n;t++) m+=t;
	while(k!=m+1)//左上三角形
	{
		if (s1[0]==k-1)
		{
			a[i][j]=k++;
			j++;
		    s1[0]+=2*t1[0]+3;
			t1[0]+=2;
		}
		else if (s1[1]==k-1)
		{
			int t=t1[1];
			while(t--)
			{
				a[i][j]=k++;
				i++;j--;
			}
			s1[1]+=2*t1[1]+3;
			t1[1]+=2;
		}
		else if (s1[2]==k-1)
		{
			a[i][j]=k++;
			i++;
			s1[2]+=2*t1[2]+3;
			t1[2]+=2;
		}
		else //if(s1[3]==k-1)
		{
			int t=t1[3];
			while (t--)
			{
				a[i][j]=k++;
				i--;j++;
			}
			s1[3]+=2*t1[3]+3;
			t1[3]+=2;
		}
	}
	j=n-1,i=n-1,k=n*n;
	int s2[4]={n*n-1,n*n-2,n*n-3,n*n-4},t2[4]={1,1,2,2};
	while (k!=m)//右下三角形
	{
		if (s2[0]==k-1)
		{
			a[i][j]=k--;
			j--;
			s2[0]-=2*t2[0]+3;
			t2[0]+=2;
		}
		else if (s2[1]==k-1)
		{
			int p=t2[1];
			while(p--)
			{
				a[i][j]=k--;
				i--;j++;
			}
			s2[1]-=2*t2[1]+3;
			t2[1]+=2;
		}
		else if (s2[2]==k-1)
		{
			a[i][j]=k--;
			i--;
			s2[2]-=2*t2[2]+3;
			t2[2]+=2;
		}
		else //if(s2[3]==k-1)
		{
			int p=t2[3];
			while (p--)
			{
				a[i][j]=k--;
				i++;j--;
			}
			s2[3]-=2*t2[3]+3;
			t2[3]+=2;
		}
	}
	for (i=0;i<n;i++)
	{
		for (j=0;j<n;j++)
		{
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}
}

输出样例:

自己写的螺旋矩阵:(螺旋矩阵像漩涡从外面开始旋转不断旋转到内部,可以是顺时针也可以是逆时针,本程序采用顺时针从外及里不断递增)

#include <iostream>
using namespace std;
#define N 6//输入矩阵的规模
void main()
{
	int a[N][N]={0},k=1,i=0,j=N-1,p=0,t=1,q=N;//数据初始化
	while(k!=N*N+1)
	{//以下判断语句是分成正方形四条边四种情况讨论。
		if ((i==p||i<N-p-1)&&j==N-p-1)//||(i==p&&j==n-p-1))
		{
			a[i][j]=k++;
			i++;
		}
		else if (j>p&&i==N-p-1)
		{
			a[i][j]=k++;
			j--;
		}
		else if (i>p&&j==p)
		{
			a[i][j]=k++;
			i--;
		}
		else if (j<N-p-1&&i==p)
		{
			a[i][j]=k++;
			j++;
		}
		if(t==4*q-4)//4*q-4为每圈数据个数。
		{
			q-=2;//每圈的边,每一圈过后,边都要减少2个单位
			p++;//每圈过后,遍历的起始数据增1,我们从外圈向里圈遍历。
			t=0;//每圈遍历过后,计数器归0。
			i=p;//每圈遍历过后,设置i和j以回归正确的遍历位置。
			j=N-p-1;//每圈遍历过后,设置i和j以回归正确的遍历位置。
		}
		t++;
	}//时间复杂度为O(N)
	for (i=0;i<N;i++)
	{
		for (j=0;j<N;j++)
		{
			cout<<a[i][j]<<"\t";
		}
		cout<<endl;
	}
}

输出样例:

以上两个程序均属于原创。

时间: 2024-12-24 18:33:04

蛇形矩阵与螺旋矩阵的相关文章

蛇形矩阵 和螺旋矩阵

1.蛇形方阵: 1  2  3 6  5  4 7  8  9 外层控制层数,内层根据列数控制方向:0 则往右走   N-1则往左走 #include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 100 int a[SIZE][SIZE]; int main(int argc, const char *argv[]) { int dim = atoi(argv[1]); int i, j,

2014螺旋矩阵

题目描述 Description 一个 n 行 n 列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动:如果前方是未曾经过的格子, 则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序,在格子中 依次填入 1, 2, 3, ... , n2,便构成了一个螺旋矩阵. 下图是一个 n = 4 时的螺旋矩阵. 1  2  3  4 12  13  14  5 11  16  15  6 10  9  8  7 现给出矩阵大小 n 以及 i 和

每日算法之四十一:Spiral Matrix II (螺旋矩阵)

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example, Given n = 3, You should return the following matrix: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 针对这个问题采用最直观的方式即可,即螺旋插入,这里有两个地方需要注意,一个是插入边界的界定,

1050. 螺旋矩阵(25)

本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条件:m*n等于N:m>=n:且m-n取所有可能值中的最小值. 输入格式: 输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数.所有数字不超过104,相邻数字以空格分隔. 输出格式: 输出螺旋矩阵.每行n个数字,共m行.相邻数字以1个空格分隔,行末不得有多余空格. 输入样例: 12 37 76 20 98 76 42 53 95

leetcode-Spiral Matrix II 螺旋矩阵2之python大法好,四行就搞定,你敢信?

Spiral Matrix II 螺旋矩阵 Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example,Given n = 3, You should return the following matrix: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 真的不容易..看博客园有人面试碰到过这个问题,长篇

Java-基础编程(螺旋矩阵&amp;乘法表)

package cn.rick.study; import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Scanner; /** * * @author Rick-bao date 2014-8-29 * */public class SomeBasicCode { public static void main(String[] args) { MultiplicationTable();//

HLG 1564 螺旋矩阵 (趣味C语言)

链接: http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1564 Description 对于给定的一个数n,要你打印n*n的螺旋矩阵. 比如n=3时,输出: 1 2 3 8 9 4 7 6 5 Input 多组测试数据,每个测试数据包含一个整数n(1<=n<=32) Output 对于每组测试数据,输出一个n*n的螺旋矩阵,定义在题目描述里. 在一组测试数据中,每个数占的字符宽度

从外向内扩的螺旋矩阵

形如: 1   2   3   4  5 16 17 18 19  6 15 24 25 20  7 14 23 22 21  8 13 12 11 10  9 如果我们需要打印这样从外部向内扩展的n * n矩阵. 分析: 可以把矩阵分为n/2个圈, (上面的例子分了两个圈,最外面的圈就是12345~16,另外一个圈就是17~24) 我们只需要以圈为单位,给二维数组中的每个数赋值.赋值的顺序也是按照数字的递增顺序(顺时针) Java代码如下: public class SpiralMatrix

编程题之打印二维螺旋矩阵

当size=4时, 二维螺旋矩阵如下图所示: 规律总结 可以把这个二维矩阵看成一层套一层,如上图所示,1->4->7->10->12为第零层, 13->14->15->16为第一层,所以当size=4时,总共有两层.规律如下: 可分层数为:若size为偶数,层数=size/2, 若为奇数,则层数=(size+1)/2; 第n层一个方向上的数字的数量为:size-2*n; 这是因为第零层的一个方向上数字的数量就是size, 而第一层是size-2,...第n层就是s