给出一个不大于 99 的正整数 n,输出 n×n 的蛇形方阵。
从左上角填上 11 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 33 个字符,前面使用空格补齐。
输入格式
输入一个正整数 n,含义如题所述。
输出格式
输出符合题目要求的蛇形矩阵。
输入输出样例
输入 #1
4
输出 #1
1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7
说明/提示
数据保证,1≤n≤9。
该题思路:
从第一排开始往右走,走到n处向下走。四个数之后向左走,再经历四个数之后向上走。
即只需要四个部分顺序由向右走到向下走到向左走到向上走,使用四个不同的循环即可满足效果,需要注意四个循环的条件,一是不能超出n个数范围,二是蛇头前方是否有数字。
上代码:
#include<stdio.h>
int main()
{
int n,x=1,y=1,m=1,a[15][15]={0}; //m为计数器,也为数组a赋值。
scanf("%d",&n);//输入题目要求n。
a[x][y]=m;//初始化数组第一个数的值为1.
while(m<n*n)//当计数器与最后一位数相等时循环结束
{
while(a[x][y+1]==0&&y+1<=n)// 向下走 限制条件 下一位数为零&&防止越界
{
y++;//进入下一位
m++;//计数器加一
a[x][y]=m;//已经进入下一位,使其获得m的值。
}
while(a[x+1][y]==0&&x+1<=n)// 无法继续向下,向左走
{
x++;
m++;
a[x][y]=m;
}
while(a[x][y-1]==0&&y-1>=1)//无法继续向左,向上走
{
y--;
m++;
a[x][y]=m;
}
while(a[x-1][y]==0&&x-1>=1)//无法继续向上,向右走,之后便回到第一个while处
{
x--;
m++;
a[x][y]=m;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)//两个for循环嵌套用以输出二维数组
{
printf("%3d",a[i][j]);//题目要求格式化输入,%3d使其占用3个字符位
}
printf("\n");//输完一排换行。
}
return 0;
}
以上,需要我们对于二维数组的理解透彻才能意识到题目本身其实就是在考察下标的利用