蓝桥杯真题–蛇形填数
题目描述:
如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20行第20列的数是多少?
#include<stdio.h>
#include<stdlib.h>
void Process(int *a, int n);
#define Max 100
int a[Max][Max] = {0};
int main()
{
int n;
printf("请输入维数n\n");
scanf("%d", &n);
int val,x,y;
val = 1; x = 0; y = n-1; //x是行数 y是列数
// 制作蛇形矩形
while ( val <= n*n) //如果 val小于等于 n*n 说明蛇形矩形没有填充完毕
{
while( x != n && !a[x][y] ) // down 从第0行 第n-1列开始 由上至下
{
a[x++][y] = val++;
}
--x,--y; // 当x=n时候 就代表x越界 所以我们--x把x变成n-1 y-- 向做移动
while( y!=-1 && !a[x][y] ) // left 从n-1列开始 从右向左填充
{
a[x][y--] = val++; // 行不动列动
}
--x; ++y; //当y=-1时 数组越界 还原y和x
while(x!=-1 && !a[x][y] ) //up 向上填充
{
a[x--][y] = val++; //行动列不动
}
++x; y++;
while( y!=n && !a[x][y] ) //right //向右填充 行不动列动
{
a[x][y++] = val++;
}
--y;++x;
}
for(int i=0;i<n;i++)
{
for( int j=0; j<n; j++)
{
printf("%5d",a[i][j]);
}
printf("\n");
}
getchar();
getchar();
return 0;
}
/*
void Process(int *a, int n) //导入数组和维数n
{
int val,x,y;
val = 1; x = 0; y = n-1; //x是行数 y是列数
// 制作蛇形矩形
while ( val <= n*n) //如果 val小于等于 n*n 说明蛇形矩形没有填充完毕
{
while( x != n && !a[x][y] ) // down 从第0行 第n-1列开始 由上至下
{
a[x++][y] = val++;
}
--x,--y; // 当x=n时候 就代表x越界 所以我们--x把x变成n-1 y-- 向做移动
while( y!=-1 && !a[x][y] ) // left 从n-1列开始 从右向左填充
{
a[x][y--] = val++; // 行不动列动
}
--x; ++y; //当y=-1时 数组越界 还原y和x
while(x!=-1 && !a[x][y] ) //up 向上填充
{
a[x--][y] = val++; //行动列不动
}
++x; y++;
while( y!=n && !a[x][y] ) //right //向右填充 行不动列动
{
a[x][y++] = val++;
}
--y;++x;
}
for(int i=0;i<n;i++)
{
for( int j=0; j<n; j++)
{
printf("%5d",a[x][y]);
}
}
}*/