【2020蓝桥杯省赛“蛇形填数“python实现】纯暴力规律求解

原题如下

【2020蓝桥杯省赛“蛇形填数“python实现】纯暴力规律求解_第1张图片

在网上找的python解答都让我云里雾里的,无奈自己太笨,于是乎开始寻找这个问题的简单规律,最后倒确实找到了:

(我先用MatLab生成了一个蛇形矩阵,这段代码是在CSDN上找的)

%Zigzag scanning 
n = 8;
a = zeros(n);
% 初始化
a(1,1) = 1;
i = 1;   %行 
j = 1;   %列
f = 0;   %标志位  1表示行增加列减小 
k = 2;
% 循环赋值     从左上角开始循环  
while(k < n^2+1)
    if(j == n)      % 已到右边界 向下移动1 行增加 f=1
        i = i+1;  f=1; a(i,j) = k; k=k+1;
        i = i+1; j = j-1;
    elseif(i == n)  % 已到下边界 向右移动1 列增加 f=0 
        j = j+1;  f=0; a(i,j) = k; k=k+1;
        i = i-1; j = j+1;
    elseif(i == 1)  % 已到上边界 向右移动1 行增加 f=0 
        j = j+1;  f=1; a(i,j) = k; k=k+1;
        i = i+1; j = j-1;
    elseif(j == 1)  % 已到左边界 向下移动1 列增加 f=1
        i = i+1;  f=0; a(i,j) = k; k=k+1;
        i = i-1; j = j+1;
    elseif(f == 1)  %行增加 列减小
        i = i+1; j = j-1;
    else            %行减小 列增加
        i = i-1; j = j+1;
    end
    % 赋值
    if(k > n^2) 
        break; 
    end
    a(i,j) = k;
    k=k+1;
end
disp(a);
由于刚开始没有注意,后来在用代码实现规律的时候才发现,这段代码只能生成半个蛇形矩阵,另一半并不满足蛇形矩阵的条件。

但是规律还是找到了:
其中,列的规律由行的变化实现,行的规律由列的变化实现。
【2020蓝桥杯省赛“蛇形填数“python实现】纯暴力规律求解_第2张图片

【2020蓝桥杯省赛“蛇形填数“python实现】纯暴力规律求解_第3张图片

【2020蓝桥杯省赛“蛇形填数“python实现】纯暴力规律求解_第4张图片【2020蓝桥杯省赛“蛇形填数“python实现】纯暴力规律求解_第5张图片

实现规律的python代码如下:

"""
思路:
这个手算就可以, 很简单
"""
column_num = 20  # 初始列数
line_num = 20  # 初始行数
line_first_num = 1  # 先设置初始值, 坐标为(1, 1) 也即蛇形矩阵的起点
result = 0  

# 列的规律由行的变化实现(现在是从第一行向右计算第三列第一行数字对应的值)
if column_num % 2 == 0:
    for i in range(1, column_num):  # 先计算目标所在列对应的第一个值(x, 1)(第一行第n列)
        if i % 2 == 1:
            line_first_num += 4 * ((i / 2) - 1) + 4  # 同一行上的数字变化本质上是等差数列和有规律的固定值的相互转换增加
        elif i % 2 == 0:
            line_first_num += 1  # 第一行的数字变换固定值为 1, 直接加
elif column_num % 2 == 1:
    for i in range(1, column_num):  # 先计算目标所在列对应的第一个值(x, 1)(第一行第n列)
        if i % 2 == 0:
            line_first_num += 4 * ((i / 2) - 1) + 4  # 同一行上的数字变化本质上是等差数列和有规律的固定值的相互转换增加
        elif i % 2 == 1:
            line_first_num += 1  # 第一行的数字变换固定值为 1, 直接加

result = line_first_num

# 行的规律由列的变化实现(现在是从第三列向下计算第三列第四行数字对应的值)
if line_num % 2 == 0:
    for j in range(1, line_num):  # 计算目标所在列从第一个数字到目标的变化(x, 1)->(x, y)
        temp_num = 2 * (column_num - 1) + 1  # 计算得到目标所在列对应的变化固定值
        if j % 2 == 0:
            result += temp_num
        elif j % 2 == 1:
            result += 4 * (j//2) + 2  # 目标所在列的等差数列规律
elif line_num % 2 == 1:
    for j in range(1, line_num):  # 计算目标所在列从第一个数字到目标的变化(x, 1)->(x, y)
        temp_num = 2 * (column_num - 1) + 1  # 计算得到目标所在列对应的变化固定值
        if j % 2 == 1:
            result += temp_num
        elif j % 2 == 0:
            result += 4 * (j//2) + 4  # 目标所在列的等差数列规律

print(result)
# result = 761

非常粗暴,但是相较其它简单的代码实现,个人认为我这个更好理解。

【2020蓝桥杯省赛“蛇形填数“python实现】纯暴力规律求解_第6张图片

引用:

matlab Zigzag scanning(蛇形矩阵)

你可能感兴趣的:(蓝桥杯,python,职场和发展,算法)