C语言入门

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

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


题目要求:输入一个正整数N,蛇形输出1~N*N。比如当N=4时。输出:

1  3  4  10 

2  5  9  11

6  8 12 15

7 13 14 16 


        看到矩阵就想到二位数组的应该不只有我一个人。一种方法是直接定义一个比较大的二维矩阵,比如A[100][100],另一种方法是先获取N的值,然后定义变长数组A[N][N],后者可以节约一丁点内存。

        其次就是如何蛇形地给A中各元素赋值,我的思路是考虑向右上方向移动或者向左下方向移动两种情况,遇到上下边界就向右平移(并转向),遇到左右边界就向下平移(并转向),到达左下角则退出循环。但其中到达右上角或左下角的情况需要特别讨论

#include<stdio.h>
//int A[1100][1100];
int main (){
	int n;
	scanf("%d",&n);
	int A[n][n];
	int i=0,j=0,k=1,d=0;//i,j代表坐标,k是要赋的值,d为方向 
		while(i!=n-1||j!=n-1){
			A[i][j]=k++;
			if(d){//向右上方移动 
				if(i==0&&j==n-1)//碰到右上角,往下走 
						i++; 
				else if(i==0)//上边界 
						j++;	
				else if(j==n-1)//右边界 
					i++;
				else{
					i--;j++;
					continue;
				}
				d=0;continue;
			}
			else{//向左下方移动 
				if(j==0&&i==n-1)
						j++;
				else if(j==0)
						i++;
				else if(i==n-1)
					j++;
				else{
					j--;i++;
					continue;
				}
				d=1;continue;
			}
		}
		
	A[i][j]=k++;//赋最后一个值	
	for (i=0;i<n;i++){//输出结果 
			for (j=0;j<n-1;j++)
				printf("%2d ",A[i][j]);
			printf("%2d\n",A[i][j]);//如此安排是为了去掉行末空格 
	}
	printf("\n");
	return 0;
}

运行结果: 

可能有人注意到了代码第二行有一个注释掉了的A[1100][1100],是因为当N比较大时(比如N=1000),在main函数里定义一个1000*1000的二维数组会报错。其中的原因小萌新也不是很懂,大概是因为windows系统在申请空间大于1M时会有问题。不过解决办法也不难,直接在main函数之外定义A就好啦。

同时,也可以用动态数组来避免全局变量(我为什么要没事找事)

#include<stdio.h>
#include<stdlib.h>//引用该头文件才能使用malloc与calloc函数 
int main (){
	int n;
	scanf("%d",&n);
	int **A=(int **)malloc(n*sizeof(int *));
	for(int i=0;i<n;i++)
		A[i]=(int *)calloc(n,sizeof(int));//此时A代表一个动态数组 
	int i=0,j=0,k=1,d=0;//i,j代表坐标,k是要赋的值,d为方向 
		while(i!=n-1||j!=n-1){
			A[i][j]=k++;
			if(d){//向右上方移动 
				if(i==0&&j==n-1)//碰到右上角,往下走 
						i++; 
				else if(i==0)//上边界 
						j++;	
				else if(j==n-1)//右边界 
					i++;
				else{
					i--;j++;
					continue;
				}
				d=0;continue;
			}
			else{//向左下方移动 
				if(j==0&&i==n-1)
						j++;
				else if(j==0)
						i++;
				else if(i==n-1)
					j++;
				else{
					j--;i++;
					continue;
				}
				d=1;continue;
			}
		}
	A[i][j]=k++;//赋最后一个值	
	for (i=0;i<n;i++){//输出结果 
			for (j=0;j<n-1;j++)
				printf("%2d ",A[i][j]);
			printf("%2d\n",A[i][j]);//如此安排是为了去掉行末空格 
	}
	printf("\n");
	
	for(int i=0;i<n;i++)
		free(A[i]);
	free(A);//释放申请的空间(但实际上此处不释放也行,毕竟程序结束会系统会自动释放。)
	return 0;
} 

//N=1000的运行结果就不给大家展示了,屏幕上根本显示不下好吧。。。

 小萌新最开始写的时候while循环里面写错好几次,搞不清楚 i 和 j 到底应该自增还是自减。感觉如果打个草稿算一下会好一点。当然非常欢迎大佬们提出更加高效,更加不易出错的解法。

另外感谢大佬 weixin_30299709:

 问题在于棋盘表格,要一个1000X1000以上的。一开始我就把棋盘定义在main函数内,结果是运行就报错。下面是解释:我从百度知道问出来的,感谢那几位热心人士,谢谢。Windows系统默认分页大小为1M(1024 *1024),当申请的空间大于1M时就会出现问题。1500X1500大于1M。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值