2020第十一届蓝桥杯省赛真题:蛇形填数

试题 D:蛇形填数

类型:结果填空,总分:10分

【问题描述】

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

在这里插入图片描述

容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列的数是多少?

【思路】

  • 这题给的位置很有规律性,很容易通过归纳规律得出结果,这里我仅从代码题角度入手,给出可以求任意第m行第n列的数是多少的代码思路

  • 思路一:

    1. 把每一斜排当成一个单位,第1斜排有1个数,第2斜排有2个数,第3斜排由3个数。。。
    2. 第i斜排和这一斜排上任意一个数的坐标(m,n)关系有i = m + n - 1,所以我们可以找到我们要求的位置在哪一斜排以及前面i-1斜排已经有了多少个数,先记录在结果中
    3. 如果我们要求的位在第奇数斜排是从左下往右上数字逐渐变大的,那么我们只需要把坐标定位到最下面的那一行,结果增大一个数,行数向上移动一行,直到移动到和所求位置相同的行数,返回结果
    4. 偶数斜排与上面的的操作相反即可

在这里插入图片描述

  • 思路二:

    1. 比较常用的思路,开一个比较大的数组,模拟填数的过程
    2. 定义一组变量当位置的指针,指针从(1,1)位置开始以向右,从右上到左下,向下,从左下到右上的顺序移动填数
    3. 输出数组对应位置的数即可

在这里插入图片描述

【代码一】

public class D {
    public static void main(String[] args) {
        int m = 20, n = 20, ans = 0;
        int cnt = m + n - 1; //确定是哪一斜排
        for(int i = 1; i < cnt; i++) { //把前i-1排的数都加到结果中
            ans += i;
        }
        //确定那一排是从上往斜下填还是从下往斜上填
        if(cnt % 2 == 0) {
            //偶数是从右上往下填
            int row = 1;
            while(row <= m) {
                ans++;
                row++;
            }
        } else {
            int row = cnt;
            while(row >= m) {
                ans++;
                row--;
            }
        }
        System.out.println(ans);
    }
}

【代码二】

public class D {
    private static int[][] matrix = new int[100][100];
    private static final int M = 20;
    private static final int N = 20;
    public static void main(String[] args) {
        int cnt = 0;
        matrix[1][1] = ++cnt;
        int col = 1, row = 1; //col代表列坐标,row代表行坐标
        while(matrix[M][N] == 0) {
            matrix[row][++col] = ++cnt; //向右
            while(col > 1) { //右上到左下
                matrix[++row][--col] = ++cnt;
            }
            matrix[++row][col] = ++cnt; //向下
            while(row > 1) { //左下到右上
                matrix[--row][++col] = ++cnt;
            }
        }
        System.out.println(matrix[M][N]);
    }
}

【结果】

761

【做题链接】

https://www.lanqiao.cn/problems/594/learning/

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值