蛇形矩阵到底难在哪里?
复杂的分类讨论!!
下面两种方法巧妙地解决了分类讨论太复杂的问题
感谢提供这种方法思路的小伙伴的支持
第一种方法
#include<stdio.h>
int main()
{ int n,i=0,j=0,cnt=0,a[100][100],k=2;
scanf("%d",&n);
a[0][n-1]=1,a[0][n-2]=2;
j=n-2; //从2开始,可以避免后面在判断循环终止时的一系列麻烦
while(i!=n-1||j!=0){ //只要不是最后一个数,就开始循环
if(cnt==0){
do{
a[++i][++j]=++k;
}while(i!=n-1&&j!=n-1); //没有到达边框都可以斜向下加一
cnt=!cnt;
}
else {
do{
a[--i][--j]=++k;
}while(i!=0&&j!=0); //没有到达边框都可以斜向上加一
cnt=!cnt;
}
if((i==0||i==n-1) && j>0) a[i][--j]=++k; //进行边框的赋值
else if((j==0||j==n-1) && i<n-1) a[++i][j]=++k;//进行边框的赋值
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%4d%c",a[i][j],j==n-1?'\n':' ');//右对齐输出
}
return 0;
}
第二种方法
#include<stdio.h>
int main()
{
int i,j,a[100][100],n,k=1;
scanf("%d",&n); //输出上三角
for(i=0; i<n; i++) //先按照一般的数组顺序对数组进行赋值
for(j=0; j<=i; j++)
{
if(i%2==0) a[i-j][j]=k++;//偶数行,往上加一 (注意数组下标的设计)
else a[j][i-j]=k++; //奇数行,往下加一 (注意数组下标的设计)
}
for(i=n; i<2*n; i++) //输出下三角 (注意数组下标的设计)
for(j=1; j<2*n-i; j++)
{
if(i%2==0) a[n-j][i-n+j]=k++;//同理
else a[i-n+j][n-j]=k++;//同理
}
for(i=0; i<n; i++)
{
for(j=n-1;j>=0;j--) printf("%4d%c",a[i][j],j==0?'\n':' ');//此时按照正确的顺序进行蛇形矩阵的输出
}
return 0;
}