题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
如下图所示,小明用从 11 开始的正整数“蛇形”填充无限大的矩阵。
1 2 6 7 15 ...
3 5 8 14 ...
4 9 13 ...
10 12 ...
11 ...
...
容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 2020 行第 2020 列的数是多少?
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
问题分析:
根据题意我们可以看到题目是按照如下方式递增
所以我们只需要让程序按照这样的要求进行对二维数组元素的赋值,当其遇到第二十行第二十列的那一个元素时,对其赋过值之后跳出循环即可,然后打印,这是暴力破解的方法。
代码实现
注:二维数组的大小可以根据题目的需要进行灵活取值
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int a[100][100]={0},num=0,flag=0,i=1;//flag是对第二十行第二十列赋值与否的状态量,num用来控制是行增加还是列增加
int countc=0,countr=0;//countc与countr分别记录列数与行数
while(1){
a[countr][countc]=i++;//对每拐一次的起点进行赋值,第一行第一列是这一段只有一个元素的特殊段
if(num%2==0&&(countc==0||countr==0)){//当num是偶数时,列增加
countc++;
num++;
while(countc!=0){//进入拐点后,这一段是沿着对角线进行的
a[countr][countc]=i++;
if(countc==19&&countr==19){//如果对第二十行第二十列的元素进行赋值跳出循环
printf("%d",a[19][19]);//可以跳出循环后打印,也可以先打印再跳出循环
flag=1;
break;
}
countc--;
countr++;
}
}else{
countr++;
num++;
while(countr!=0){//与上面同理
a[countr][countc]=i++;
if(countc==19&&countr==19){
printf("%d",a[19][19]);
flag=1;
break;
}
countr--;
countc++;
}
}
if(flag==1){
break;
}
}
return 0;
}