蛇形填数(Java代码)

蛇形填数(Java代码)

题目描述:
如下图所示,小明用从 1开始的正整数“蛇形”填充无限大的矩阵。
容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列的数是多少?

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

在这里插入图片描述
查看该图可以发现每一条斜线都是承递增或递减的趋势变化的,第一条斜线[1],第二条斜线 [2, 3] ,第三条 [6, 5, 4] ,第四条 [7, 8, 9, 10], 第五条 [15, 14, 13, 12, 11], 取每一条斜线的第一个元素也就是看数据的第一行,可以发现如下的规律

由   1(1)  位置到  2(2) 位置    --->    加了 1
由   2(2)  位置到  3(6) 位置    --->    加了 4 ( 2 - 1 + 3 )  
由   3(6)  位置到  4(7) 位置    --->    加了 1
由   4(7)  位置到 5(15) 位置    --->    加了 8 ( 4 - 1 + 5 )
由  5(15)  位置到 6(16) 位置    --->    加了 1

这样就可以推出第一行的每一个数的值与他所在的列数有关, 如果是奇数列偶数列那么偶数列的值就是奇数列的值加 1, 如果是偶数列奇数列那么奇数列的值就是加上 偶数列的列数减一奇数列的数;
根据如上的规律可以写出如下代码

	// i 为 当前的列数
	if(i%2 == 0)
	{
		// 为偶数列就在前一列的基础上加1
	    result++;
	}
	else
	{
		// 奇数列就在前一列的基础上加上当前列的列数和前一列的列数减一
	    result += (i - 2) + i;
	}

到这已经可以算出第一行的每一位数的值了, 剩下的就是算 [20, 20] 的值了.
先观察一下 [3, 3] 位置数所在的斜线位置.
在这里插入图片描述
如图可以看到 [3, 3] 的数落在 5 ( 3*2 - 1 ) 的位置上, 所以要求 [20, 20] 上的数需要先求得 39 ( 20x2 - 1 ) 列的数, 然后还能发现 [3, 3] 在斜线的中点上(这里就不画图了) . 而在一开始就说了斜线是承着递增或递减的趋势, 所以下一步就是判断结果所在的斜线是递增的还是递减的;
在这里插入图片描述
如图只要该数所在的列数为偶数的话他就是承递减趋势, 列数为奇数的话承递增的趋势,所以代码可以写成

		//  i当前列的列数
        if(i%2 == 0)
        {
        	// 偶数列承上升趋势
            return result + (i/2);
        }
        else
        {
        	// 奇数列承下降趋势
            return result - (i/2);
        }

要其他位置的数时也可以根据当前列的趋势和直线的斜率求该点所在的斜线得出.

以下为完整代码

    static int snake_num(int x)
    {
        if(x == 1 || x == 2)
            return x;

        int result = 2;
        int i = 3;

        for(; i <= 2*x; i++)
        {
            if(i%2 == 0)
                result++;
            else
                result += (i - 2) + i;
        }

        if(i%2 == 0)
            return result + (i/2);
        else
            return result - (i/2);
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 蛇形数是一种将数字按照蛇形排列的方式充到矩阵中的问题。以下是一个使用Python实现蛇形数的示例代码: ```python def snake_fill(n): # 创建一个 n x n 的空矩阵 matrix = [[0] * n for _ in range(n)] num = 1 i = j = 0 direction = 1 while num <= n * n: matrix[i][j] = num if direction == 1: if j == n - 1 or matrix[i][j + 1] != 0: direction = 2 i += 1 else: j += 1 elif direction == 2: if i == n - 1 or matrix[i + 1][j] != 0: direction = 3 j -= 1 else: i += 1 elif direction == 3: if j == 0 or matrix[i][j - 1] != 0: direction = 4 i -= 1 else: j -= 1 elif direction == 4: if i == 0 or matrix[i - 1][j] != 0: direction = 1 j += 1 else: i -= 1 num += 1 return matrix n = int(input("请输入正整数n:")) result = snake_fill(n) # 打印蛇形数的矩阵 for row in result: for num in row: print(num, end="\t") print() ``` 该代码中,首先创建一个 n x n 的空矩阵。然后定义一个变量 num,表示当前要入的数字。定义变量 i 和 j,表示当前要入数字的位置。定义变量 direction,表示当前数字充的方向。 接下来,通过循环不断入数字,直到满整个矩阵。在循环中,根据当前充的方向,判断下一个位置是否可入数字。如果可入,则更新当前位置,并根据充方向更新下一个位置。如果不能入,则修改充方向。最后返回充好的矩阵并打印输出。 ### 回答2: 蛇形数是一种数学问题,它要求将从1开始的连续整数按蛇形顺序入一个矩阵中。以下是使用Python编写的蛇形数的代码: ```python def snake_fill(n): matrix = [[0 for _ in range(n)] for _ in range(n)] # 创建一个n x n的矩阵 num = 1 # 从1开始充数字 x, y = 0, 0 # 初始位置为矩阵的左上角 direction = 0 # 初始方向为向右 while num <= n * n: matrix[x][y] = num # 将当前数字入当前位置 # 根据当前方向移动位置 if direction == 0: # 向右 if y < n - 1 and matrix[x][y + 1] == 0: y += 1 else: direction = 1 # 改变方向为向下 elif direction == 1: # 向下 if x < n - 1 and matrix[x + 1][y] == 0: x += 1 else: direction = 2 # 改变方向为向左 elif direction == 2: # 向左 if y > 0 and matrix[x][y - 1] == 0: y -= 1 else: direction = 3 # 改变方向为向上 elif direction == 3: # 向上 if x > 0 and matrix[x - 1][y] == 0: x -= 1 else: direction = 0 # 改变方向为向右 num += 1 # 数加一 return matrix # 测试代码 n = 5 # 设置矩阵的大小 result = snake_fill(n) # 调用函数进行蛇形数操作 # 输出结果 for row in result: print(row) ``` 以上代码通过使用一个n x n的矩阵,按照规定的蛇形数路径,将从1开始的连续整数充进去。首先定义了一个空矩阵,然后通过一个while循环依次充数字并移动位置,直到所有数字都被充完毕。最后可以通过遍历矩阵并输出结果。 ### 回答3: 蛇形数是一种常见的数学问题,要求将一串数字按照蛇形的顺序入一个矩阵中。下面是一个Python代码示例,用于实现蛇形数: ```python def snake_fill(n): matrix = [[0] * n for _ in range(n)] # 创建一个n x n的矩阵 direction = 0 # 0表示向右,1表示向下,2表示向左,3表示向上 count = 1 # 要入的数字 row, col = 0, 0 # 当前位置的行和列 while count <= n * n: matrix[row][col] = count # 根据当前方向更新下一个位置 if direction == 0: if col + 1 < n and matrix[row][col + 1] == 0: col += 1 else: direction = 1 row += 1 elif direction == 1: if row + 1 < n and matrix[row + 1][col] == 0: row += 1 else: direction = 2 col -= 1 elif direction == 2: if col - 1 >= 0 and matrix[row][col - 1] == 0: col -= 1 else: direction = 3 row -= 1 elif direction == 3: if row - 1 >= 0 and matrix[row - 1][col] == 0: row -= 1 else: direction = 0 col += 1 count += 1 return matrix n = int(input("请输入矩阵的大小:")) result = snake_fill(n) for row in result: for num in row: print(num, end="\t") print() ``` 以上代码中,我们首先创建了一个 n x n 的矩阵,然后使用一个循环来不断入数字,直到满为止。循环中,我们通过一个 direction 变量来记录当前的走向,根据不同的走向来更新下一个位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值