吉利筆記試験 - プログラミング コードの質問

Q1:

n 行 m 列のテーブルがあり、n✖️m 個のブロックに分割できるとします。

  • 左上隅から右下隅までを結ぶ対角線があり、その対角線に接するテーブル内のブロックはすべて白色、つまりテーブル内の小さなブロックを対角線が通過します。
  • テーブルのサイズを入力し、白いブロックの数を出力します。

n 行 m 列の長方形は、サイズ 1 の n✖️m 個の正方形のブロックに分割されているとみなすことができます。出力対角線上の通過ブロックの数をカウントします。

例: 3、4 と入力します。 6を出力する必要があります

  • n または m のいずれかである場合1 の場合、対角線は 1 つのブロック、つまり n * m のみを通過します。
  • それ以外の場合、対角線は長方形の最初の行最後の行を通過します。 最初の列および最後の列 の場合、 4 行のブロックは繰り返しカウントされます残りのブロックは 1 回だけカウントされます。したがって、対角線上の通過ブロックの数は次のように計算できます。
    • 対角ブロックの数 = n + m − 1 − g c d ( n , m ) + 1 n + m - 1 - gcd(n, m) + 1 n+メートル1gcd(n m)+1
    • 其中,gcd(n, m) 表示n和m的最大公约数
import math

def count_diagonal_blocks(n, m):
    if n == 1 or m == 1:
        return n * m
    else:
        return n + m - math.gcd(n, m)

# 输入表格的大小
n = 3
m = 4

# 计算对角线上经过的块的数量
diagonal_blocks = count_diagonal_blocks(n, m)
print("对角线上经过的块的数量:", diagonal_blocks)


Q2:

迷路を表す文字列のリストを入力します。

  • このうち、j は壁、空格 は入口、k は人の開始位置を表します。 。
  • 人は左右または上下にしか移動できません。
  • 迷路は正方形である必要はないことに注意してください。
  • 人が外に出られることを示す場合は true を出力し、それ以外の場合は false を出力します。

たとえば、["j jj"、"j kj"、"jjjj"] と入力します。 trueを出力

要素 k が 1 つだけの場合も true が出力されます
外側の円がすべて壁 j の場合も false が出力されます

def can_escape_maze(maze):
    if not maze:
        return False

    def dfs(x, y):
        if x < 0 or x >= len(maze) or y < 0 or y >= len(maze[0]) or maze[x][y] == 'j':
            return False

        if maze[x][y] == ' ':
            return True

        maze[x] = maze[x][:y] + 'j' + maze[x][y + 1:]

        if (dfs(x + 1, y) or
            dfs(x - 1, y) or
            dfs(x, y + 1) or
            dfs(x, y - 1)):
            return True

        return False

    # 检查外围一圈是否都是墙
    for i in range(len(maze)):
        if i == 0 or i == len(maze) - 1:
            for j in range(len(maze[i])):
                if maze[i][j] != 'j':
                    return False
        else:
            if maze[i][0] != 'j' or maze[i][-1] != 'j':
                return False

    # 找到起始位置
    for i in range(1, len(maze) - 1):
        for j in range(1, len(maze[i]) - 1):
            if maze[i][j] == 'k':
                return dfs(i, j)

    return False

# 输入迷宫
maze = [
    "jjjjjjjj",
    "j j jj j",
    "j jkj  j",
    "j j j jj",
    "j j j  j",
    "j      jj",
    "jjjjjjjj"
]

# 检查是否可以走出迷宫
result = can_escape_maze(maze)
print(result)


Q3:

n✖️n サイズの配列を入力します。これは外側から内側に時計回りの順序で出力する必要があります。

  • 例如,输入 [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] , [ 7 , 8 , 9 ] ] [[1 ,2,3],[4,5,6],[7,8,9]] [[1,23][4,56][7,89]] 输出应该为 [ 1 , 2 , 3 , 6 , 9 , 8 , 7 , 4 , 5 ] [1,2,3,6,9,8,7,4,5] [1,23698745]

行列の外側の要素を順番に外側から内側に時計回りに走査し、その後 レイヤーごとに内側に移動

def spiral_order(matrix):
    if not matrix:
        return []

    result = []
    while matrix:
        # 从左到右
        result += matrix[0]

        # 从上到下
        if len(matrix) > 1:
            for row in matrix[1:-1]:
                if row:
                    result.append(row[-1])

        # 从右到左
        if len(matrix) > 1:
            result += matrix[-1][::-1]

        # 从下到上
        if len(matrix) > 2:
            for row in matrix[-2:0:-1]:
                if row:
                    result.append(row[0])

        # 剔除已经遍历的外围元素
        matrix = matrix[1:-1]
        for i in range(len(matrix)):
            if matrix[i]:
                matrix[i] = matrix[i][1:-1]

    return result

# 输入矩阵
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 获取顺时针排列的结果
result = spiral_order(matrix)
print(result)

おすすめ

転載: blog.csdn.net/weixin_43338969/article/details/134090094