#include<stdio.h>
#include<string.h>
#define maxn 20
//它代表20,如果在程序里面写
//
//if(i<maxn){.........}
//
//编译器在处理这个代码之前会对maxn进行处理替换为20。
int a[maxn][maxn];//生成一个整形的二维数组,这个数组共有maxn*maxn个元素。分别为a[0][0],a[0][1]...a[maxn][maxn]
int main()
{
int x,y,n,tot=0;//tot即为我们的1,2,3...要显示的数字
scanf("%d", &n);
memset(a,0,sizeof(a));//作用是把数组a清零,它在string.h中定义。 把所有格子都赋值为0,可以方便判断是否以前走过;这和下面的 !a[x+1][y]相关联
a[x=0][y=n-1] = tot = 1;//赋值x=0,y=n-1 后马上要把他们 作为数组a的下标,因此合并完成,而tot和a[0][n-1]都要赋值一,也可以合并完成
while(tot<n*n)
{
while(x+1<n && !a[x+1][y]) a[++x][y] = ++tot;//因为a[0][3]已经在上面赋值为1,所以应该从a[1][3]开始,即x+1,
while(y-1>=0 && !a[x][y-1]) a[x][--y] = ++tot;//!a[x+1][y]是单目运算符因为他只有一个操作数a,!为逻辑非,判断是否a[x+1][y]==0,就是看看是不是以前走过,简写成!a[x+1][y],他的意思是若a=0则为真。&&是短路运算符。同真则真,一假则假。
while(x-1>=0 && !a[x-1][y]) a[--x][y] = ++tot;
while(y+1<n && !a[x][y+1]) a[x][++y] = ++tot;
}
for(x=0;x<n;x++)
{
for(y=0;y<n;y++)
printf("%3d", a[x][y]);//%3d是指表示以3位的固定宽度输出整型数 ,不足3位,在前面补空格; 超过3位,按实际位数输出 ,在这里的作用是主要让有数字之间空格,看着齐整,不信可以删了它试试
printf("\n"); //作用是每一行输出后要换行
}
return 0;
}
蛇形填数
最新推荐文章于 2018-11-10 17:19:37 发布