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+メートル−1−gcd(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,2、3]、[4,5、6]、[7,8、9]] 输出应该为 [ 1 , 2 , 3 , 6 , 9 , 8 , 7 , 4 , 5 ] [1,2,3,6,9,8,7,4,5] [1,2、3、6、9、8、7、4、5]
行列の外側の要素を順番に外側から内側に時計回りに走査し、その後 レイヤーごとに内側に移動
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)