如下图所示,小明用1开始的正整数“蛇形” 填充无限大的矩阵

容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20 行第20 列的数是多少?
1. 我们要观察整体——这是一个矩阵带有行和列, 那我们就可以用二维数组去表示行列。
2.我们要观察数字的变化规律——(我们用二维数组就可以不用带a[0][0]从a[1][1]开始)
a[ 1 ][ 1 ]= 1, a[ 1 ][ 2 ]= 2, a[ 1 ][ 3 ]= 6,
a[ 2 ][ 1 ]= 3, a[ 2 ][ 2 ]= 5,
a[ 3 ][ 1 ]= 4,
我们用x y定位数组会发现 奇数列的对角线变化是从右上到左下,偶数列的对角线是左上到右下。
带入x y 中就是奇数列x++,y--。偶数列y++,x--。
3.我们要优化细节——我们会发现每一列对角线的开头都是有规律的
偶数列是x=1,y=第几列 奇数列是y=1,x=第几行。
例子:(第二列开头是a[ 1 ][ 2 ]= 2,第三列开头是a[ 3 ][ 1 ]= 4,)
第二列对角线是2 3,第三列对角线是4 5 6 我们会发现每一列对角线的数字个数跟那一列有关
例子:(第二列有两个数字,第三列有三个数字)
4.都搞完了就写代码吧。哈哈
#include <iostream>
using namespace std;
int a[40][40]= {0}; //定义一个大点的免的不够
int main() {
int i,x=0,y=0,num=1,j;
for(i=1; i<40; i++) { // 从a[1][1]开始没要a[0][0]
if(i%2==1) { // 判断奇数列
x=1; //每当到奇数列时会发现x=1 y=i
y=i;
for(j=1; j<=i; j++) {
a[x][y]=num++;
x++; //奇数列左下到右上
y--; //观察x与y的变化规律定位数组坐标
}
} else {
x=i;
y=1;
for(j=1; j<=i; j++) {
a[x][y]=num++;
x--;
y++;
}
}
}
printf("%d",a[20][20]);
}//也可以把20行20列的全打印出来看看符不符合规律。记得调整黑框框的大小,让每行列都是20个数字
1万+



被折叠的 条评论
为什么被折叠?



