大家好,这里是刚接触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。