C语言入门

大家好,这里是刚接触C语言的小萌新。

今天再来分享一道关于矩阵的题目


题目要求:输入两个整数n与m代表矩阵的行数与列数,输出蛇形矩阵。(蛇形矩阵,指从矩阵的(1.1)开始,向右依次填写1,2,3,,,遇到边界或已填的数右转,直到填满整个矩阵。


        考虑到存在四个方向,小萌新选择设定一个参数d(direction)来表示前进的方向,用switch函数判断如何前进。由于n和m的大小不确定,为了节约内存,小萌新采用了变长数组(variable-length array,VLA)来表示这个矩阵。需要注意的是变长数组在定义时不能被初始化。

#include<stdio.h>
int main (){
	int n,m;
	scanf("%d %d",&n,&m);
	int A[n+2][m+2];//定义变长数组 
	int i=0,j=0,k=1;
	for(i=n+1;i>=0;i--) for(j=m+1;j>=0;j--)//把A初始化成周围一圈1(代表边界),中间全是0 
		if(i==0||i==n+1||j==0||j==m+1) A[i][j]=1;
		else A[i][j]=0;
	i=j=1;
	int d=1;
	while(k<=n*m){//k=n*m时填充完毕
	A[i][j]=k++;
		switch(d){//用d代表前进的方向 
			case 1:if(A[i][j+1]){//if用于判断是否遇到非0数 
				i++;
				d=2;
			}
			else j++;
				break;
			case 2:if(A[i+1][j]){
				j--;
				d=3;
			}
			else i++;
				break;
			case 3:if(A[i][j-1]){
				i--;
				d=4;
			}
			else j--;
				break;
			case 4:if(A[i-1][j]){
				j++;
				d=1;
			}
			else i--;
			break;
		}
	}
	for(i=1;i<=n;i++) {//输出 
		for(j=1;j<=m;j++)
			printf("%2d ",A[i][j]);
		printf("\n");
	}
	printf("\n");
	return 0;
}

运行结果:30c497a8655f4a99ab0e7f7ce3312ed8.png

 关于变长数组与普通数组的区别(个人理解,欢迎补充):

1VLA不能再声明时初始化,当普通数组可以(int a[n]={};//错误!!)

2普通数组可能浪费内存,VLA基本不会(假如本题规定了n,m小于1000,也可直接声明A[1000][1000],但这样可能会浪费大量内存。)

但VLA与普通数组都属于静态数组,储存在栈中,程序结束后系统会自动释放。这与储存在堆里,需要程序员手动释放的动态数组是不一样的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值