【算法】采用递归与非递归算法打印螺旋矩阵(C++源码)
- 一、螺旋矩阵
- 二、源代码-递归(C++)
- 三、运行截图
- 四、源代码-非递归(C++)
- 五、运行截图
一、螺旋矩阵
螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环
二、源代码-递归(C++)
#include "stdio.h"
#include <iostream>
/*void SetMatrix(int **matrix, int x, int y, int start, int n) {
int i, j;
if (n <= 0)
return;
if (n == 1) {
matrix[x][y] = start;
return;
}
for (i = x; i < x + n-1; i++) //上部
matrix[y][i] = start++;
for (j = y; j < y + n-1; j++) // 右边
matrix[j][x+n-1] = start++;
for (i = x+n-1; i > x; i--) // 底部
matrix[y+n-1][i] = start++;
for (j = y+n-1; j > y; j--) // 左边
matrix[j][x] = start++;
SetMatrix(matrix, x+1, y+1, start, n-2); // 递归
}*/
void SetMatrix(int **a,int d, int N,int i) {
if(d==N/2)
{
if(N%2)
a[(N-1)/2][(N-1)/2]=i;
return;
}
for(int j=0+d;j<N-1-d;j++)
a[0+d][j]=i++;
for(int k=0+d;k<N-d-1;k++)
a[k][N-1-d]=i++;
for(int l=N-d-1;l>0+d;l--)
a[N-1-d][l]=i++;
for(int m=N-1-d;m>=1+d;m--)
a[m][0+d]=i++;
SetMatrix(a,d+1,N,i);
}
void main() {
int i, j;
int n;
int **matrix; //螺旋矩阵(二维数组)
scanf("%d", &n);
matrix = (int **)malloc(n * sizeof(int *)); //为矩阵分配空间
for (i = 0; i<n; i++)
matrix[i] = (int *)malloc(n * sizeof(int));
SetMatrix(matrix, 0, n,0);
//打印螺旋矩阵
for(i = 0; i < n; i++) {
for (j = 0; j < n; j++)
printf("%4d", matrix[i][j]);
printf("\n");
}
}
三、运行截图
四、源代码-非递归(C++)
#include<stdio.h>
#include<malloc.h>
int main()
{
int **p=NULL;
int n,i,j,k=1,line,row;
printf("请输入矩阵的行数:");
scanf("%d",&n);
if((p=(int**)malloc(sizeof(int**)*n))==NULL)//根据行数分配内存,分配双指针
{
printf("不能分配内存!!!\n");
return 1;
}
for(i=0;i<n;i++)
{
if((p[i]=(int*)malloc(sizeof(int*)*n))==NULL)//为每一行分配指针,每一行有n个数
{
printf("不能分配内存!!!\n");
return 1;
}
}
//螺旋矩阵思想是:随着k的增大,矩阵最外围先被幅值,最外面一圈赋值完成后,再向里面一层赋值,如此循环
//所以可以按照这个思想,每转一圈为一个大循环,一直循环下去,直至k<=n*n;
for(i=0,j=0;k<=n*n;i++,j++)
{
for(row=j;row<n-j;row++)
{
p[i][row]=k++;
}
for(line=i+1;line<n-i;line++)
{
p[line][n-j-1]=k++;
}
for(row=n-j-2;row>=j;row--)
{
p[n-i-1][row]=k++;
}
for(line=n-i-2;line>i;line--)
{
p[line][j]=k++;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%-6d",p[i][j]);
}
printf("\n");
}
for(i=0;i<n;i++)//分别释放每一行的指针
{
free(p[i]);
p[i]=NULL;
}
free(p);//释放双指针
p=NULL;
return 0;
}
五、运行截图