【算法】采用递归与非递归算法打印螺旋矩阵(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");
       }
}

三、运行截图

5

四、源代码-非递归(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;
}

五、运行截图

5

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
数据结构和算法是计算机科学中非常重要的内容,而源码则是实现这些内容的代码。C语言是一种非常常用的编程语言,用它编写出的源码简洁、高效,成为许多学习者和专业开发者的首选。 C语言提供了强大的功能和灵活性,适用于编写各种数据结构和算法源码。使用C语言编写数据结构和算法源码可以充分利用计算机的资源,提高执行效率,尤其适合处理大规模数据和需要高性能的应用场景。 数据结构是指数据在计算机中组织和存储的方式,包括数组、链表、树、图等。算法则是解决问题的步骤和方法,比如查找、排序、图遍历等。编写数据结构和算法源码需要考虑其时间复杂度、空间复杂度等性能指标。 C语言提供了丰富的库函数和操作符,可以方便地实现各种数据结构和算法。比如可以使用数组和指针实现动态内存分配,实现链表、树等数据结构;可以利用递归和迭代实现各种搜索、排序和图算法。 编写数据结构和算法源码需要考虑代码的可读性和复用性,可以采用模块化和面向对象的方式进行设计。合理划分函数和数据结构的职责、利用封装和继承等机制可以增加代码的可维护性和可扩展性。 综上,使用C语言编写数据结构与算法源码可以充分发挥C语言的性能优势,实现高效的计算和处理。同时,通过合理的设计和代码结构,可以增加源码的可读性和复用性。因此,学习和掌握C语言的数据结构与算法源码是每个计算机科学学生和开发者的必备技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码两年半的练习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值