目录
一、题目
题目描述
给你一个整数n,输出n∗n的蛇形矩阵。
输入描述:
输入一行,包含一个整数n
输出描述:
输出n行,每行包含n个正整数,通过空格分隔。 1<=n<=1000
示例1
输入
4
输出
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
二、分析
1.定义一个大于n*n的二维数组a
2.给a[1][1]赋值为1
3.按照红线顺序对数组赋值
进入循环,对每一条红线(先向左下方向,再向下,再向右上方向)依次赋值
定义f为一个数,用于赋值给数组,每次使用后加1。
①
for(j=0;;j++) //向左下
{
if(1+j<=n&&i-j<=n)
{
a[1+j][i-j]=f;
f++;
}
if(i-j==1) break;//如果循环中赋值到了第一列,则停止循环,退出循环
}
其中的 if(1+j<=n&&i-j<=n)
需要这行代码的原因是由于定义的二维数组是大于n*n的,所以每次赋值需要判断是不是在n*n的范围内,若不存在则不赋值,f不变。 如图假设n=4时,到最左下角时,超出n*n的范围,则对最左下角不赋值,并且f不变。
以下相同。
②
if(j+2<=n)//判断a[j+2][1]是不是在n*n的范围内
{
a[1+j+1][1]=f;
f++;
}
③
for(k=1;;k++) //右上
{
if(j+2-k<=n&&1+k<=n)
{
a[j+2-k][1+k]=f;f++;
}
if(j+2-k==1) break;//如果循环中赋值到了第一行,则停止循环,退出循环
}
最后进入循环,给下一条红线进行依次赋值。
三、完整代码
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int i,j,k;
int a[1100][1100]={0};
int f=1;
a[1][1]=f;f++;
for(i=2;i<=n*2;i+=2)
{
for(j=0;;j++) //向左下
{
if(1+j<=n&&i-j<=n)
{
a[1+j][i-j]=f;
f++;
}
if(i-j==1) break;
}
if(j+2<=n)
{a[1+j+1][1]=f;f++;}// 向下一格
for(k=1;;k++) //向右上
{
if(j+2-k<=n&&1+k<=n)
{
a[j+2-k][1+k]=f;f++;
}
if(j+2-k==1) break;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}