剑指Offer SnakeNumber 蛇形填数

本文介绍了一个蛇形填充算法,该算法能在n*n的方阵中按蛇形路径填充1到n*n的整数。通过从上往下、从右往左等四个步骤循环迭代,确保每个位置只被访问一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
在n*n的方阵里填入1,2..,n*n 要求填成蛇形

例如n=4时方阵为:

10 11 12 1
9  16 13 2
8  15 14 3
7  6  5  4

思路:
首先蛇形填入数据,可以把操作分为四个步骤:从上往下,从右往左,从下往上,从左往右。
定义x,y表示元素在矩阵中的横纵坐标,首先循环从上往下给数组赋值,纵坐标y不变 横坐标x递增,直到横坐标达到矩阵的边界n-1结束。之后是从右往左打印,横坐标不变,纵坐标递减到矩阵边界即0为止。之后从下往上,纵坐标不变,横坐标递减到0.再从左往右,此时的循环出口条件就不是到矩阵边界了,因为最左上角的元素在第一轮操作就已经赋值了,这个时候我们想到初始化矩阵数组时,默认为数组的每个元素赋值为0,因此我们可以考虑添加出口条件就是当前元素的后一个元素不为0时,证明该元素已经在之前被符号值 我们直接跳出循环改变方向即可

public static int[][] fillSnakeNumber(int n) {
        int[][] matrix = new int[n][n];//定义方阵 默认初始化每个元素为0
        int x, y;//表示方阵的横纵下标
        int count = matrix[x = 0][y = n - 1] = 1;//表示当前数值
        while (count < n * n) {
            //先从上往下
            while (x + 1 <  n && matrix[x + 1][y] == 0) {
                matrix[++x][y] = ++count;
            }
            //再从右往左
            while (y - 1 >= 0 && matrix[x][y - 1] == 0) {
                matrix[x][--y] = ++count;
            }
            //从下往上
            while (x - 1 >= 0  && matrix[x - 1][y] == 0) {
                matrix[--x][y] = ++count;
            }
            //从左往右
            while (y + 1 < n && matrix[x][y + 1] == 0) {
                matrix[x][++y] = ++count;
            }
        }
        return matrix;
    }

测试数据:

@Test
    public void testFillSnakeNumber() throws Exception {
        int[][] ints = SnakeNumber.fillSnakeNumber(4);
        for (int i = 0; i < ints.length; i++) {
            for (int j = 0; j < ints[i].length; j++) {
                System.out.print(ints[i][j]+"     ");
            }
            System.out.println();
        }
    }

输出结果

10     11     12     1     
9     16     13     2     
8     15     14     3     
7     6     5     4     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值