第十一届蓝桥杯省赛B组—— 蛇形填数
题目描述
如下图所示,小明用从 1
开始的正整数“蛇形”填充无限大的矩阵。
1 2 6 7 15 ...
3 5 8 14 ...
4 9 13 ...
10 12 ...
11 ...
...
容易看出矩阵第二行第二列中的数是 5
。请你计算矩阵中第 20
行第 20
列的数是多少?
运行限制
最大运行时间:1s
最大运行内存: 128M
答案:761!
总体思路
开一个布尔变量up
,up = true
为向斜上方走,up = false
为斜下方走。
当i >= 20 && j >= 20
的时候推出循环,输出答案a[19][19]
;
下图中:黑色箭头表示开始。
step1:如果up = true
,即为向斜上走,看一下是否出现越界,;
如果越界则up = false; j ++ ;
换成斜下方走,同时向右移动一格。
如果未越界则i -- ; j ++ ;
则向斜上方走!
if(up && i - 1 < 0)
{
j ++ ;
up = false;
}
else if(up && i - 1 >= 0)
{
i -- ;
j ++ ;
}
step2:如果up = false
,即为向斜下走,看一下是否出现越界;
如果越界则up = true; i ++ ;
换成斜上方走,同时向下移动一格。
如果未越界则j -- ; i ++ ;
则向斜下方走!
if(!up && j - 1 < 0)
{
i ++ ;
up = true;
}
else if(!up && j - 1 >= 0)
{
j -- ;
i ++ ;
}
c++代码
#include <iostream>
using namespace std;
int main()
{
int a[100][100];
int i = 0, j = 0;
int cnt = 0;
bool up = true;
while(i < 20 || j < 20)
{
a[i][j] = ++ cnt;
if(up && i - 1 < 0)
{
j ++ ;
up = false;
}
else if(up && i - 1 >= 0)
{
i -- ;
j ++ ;
}
else if(!up && j - 1 < 0)
{
i ++ ;
up = true;
}
else if(!up && j - 1 >= 0)
{
j -- ;
i ++ ;
}
}
printf("%d", a[19][19]);
return 0;
}
Java代码
import java.util.*;
public class Main {
public static void main(String args[]) {
int[][] a = new int[100][100];
int i = 0, j = 0;
int cnt = 0;
boolean up = true;
while(i < 20 || j < 20)
{
a[i][j] = ++ cnt;
if(up && i - 1 < 0)
{
j ++ ;
up = false;
}
else if(up && i - 1 >= 0)
{
i -- ;
j ++ ;
}
else if(!up && j - 1 < 0)
{
i ++ ;
up = true;
}
else if(!up && j - 1 >= 0)
{
j -- ;
i ++ ;
}
}
System.out.println(a[19][19]);
}
}