El segundo partido provincial de la XI Copa del Puente Azul Python Group-Serpentine Filling the Numbers

1. Descripción del problema:

Como se muestra en la figura siguiente, Xiaoming llena una matriz infinita con una "forma de serpiente" de enteros positivos a partir de 1.
1 2 6 7 15…
3 5 8 14…
4 9 13…
10 12…
11
…… Es
fácil ver que el número en la segunda fila y segunda columna de la matriz es 5. ¿Podría calcular el número en la fila 20 y la columna 20 de la matriz? Esta es una pregunta para llenar los espacios en blanco, solo necesita calcular el resultado y enviarlo. El resultado de esta pregunta es un número entero. Al enviar la respuesta, solo complete este número entero. Si completa el contenido adicional, no podrá puntuar.

2. Análisis de pensamiento:

Analizando la pregunta, podemos saber que podemos juzgar las reglas de estos números al completar según las características de los números en la pregunta. Podemos encontrar que existen dos direcciones repetitivas de generar acciones a partir del número 2. La primera La dirección es inferior izquierda-inferior y la primera dirección es inferior izquierda-inferior. Las dos direcciones son superior derecha-derecha. Se puede saber que estas dos direcciones repetitivas se pueden representar mediante dos bucles while, es decir, las dos direcciones son representado por bucles. La condición de terminación del primer bucle se alcanza cuando se baja a la izquierda Después de la primera columna, debe bajar una fila en este momento. La condición de terminación del segundo bucle es que se alcanza la primera fila cuando se sube. esta vez, debe ir una fila a la derecha, y el problema de análisis puede saber porque es la fila 20. Y la columna 20. Por lo tanto, la respuesta definitivamente no se genera en el límite, por lo que debe generarse al completar los números en los dos bucles, por lo que deberíamos establecer una bandera f al principio para que encontremos cuando pasemos por los dos bucles Si llega a la fila 20 y la columna 20, entonces todos los bucles deben salir en este momento, por lo que el bucle más externo es necesario para anidar dos bucles para completar números, combinado con una bandera f para finalizar todos los bucles. Y podemos declarar una lista bidimensional para registrar el resultado de la posición correspondiente en la lista bidimensional al completar los números, y finalmente generar esta lista para determinar si el algoritmo tiene errores (este método es aún más efectivo para verificar si el código tiene errores)

3. El código es el siguiente:

if __name__ == '__main__':
    # 首先从数字2开始进行循环, 左下-下, 右上-右这两个方向分别为一组, 主要还是找规律吧, 找出循环的共性条件即可
    x, y, n = 0, 1, 2
    # 设置一个标志来是否找到了这个数字了
    f = 1
    # 其实可以声明一个列表进行验证看是否生成的数字的位置正确
    li = [[0] * 100 for i in range(100)]
    li[0][0], li[0][1] = 1, 2
    while f:
        # 注意y大于0才循环因为在循环中做出了减1的动作
        while y > 0:
            # 判断是否是找到了, 很明显答案只能够在矩阵的中间范围, 不可能是在边界上得到范围所以在这里判断即可
            if x == 19 and y == 19:
                f = 0
                break
            y -= 1
            x += 1
            # 数字加1
            n += 1
            li[x][y] = n
        # 往下走一行, 注意必须是当没有找到这个数字的时候才可以执行往下或者是往右走一格
        if f:
            x += 1
            n += 1
            li[x][y] = n
        while x > 0:
            # 判断是否是找到了
            if x == 19 and y == 19:
                f = 0
                break
            x -= 1
            y += 1
            n += 1
            li[x][y] = n
        # 往右边走一格
        if f:
            y += 1
            n += 1
            li[x][y] = n
    print(n)
    for i in range(100):
        for j in range(100):
            print(li[i][j], end=" ")
        print()

 

Supongo que te gusta

Origin blog.csdn.net/qq_39445165/article/details/114953704
Recomendado
Clasificación