добавил вариант решения первой задачи

This commit is contained in:
Игорь
2026-04-01 11:41:06 +03:00
parent 5970d8323e
commit 04f96b1df9

107
task1(2).py Normal file
View File

@@ -0,0 +1,107 @@
import random as r
import bisect as b
def search_binary_diagonal(matrix, K):
"""
Поиск числа K в матрице N x M
"""
if not matrix or not matrix[0]:
return False, 0
N = len(matrix)
M = len(matrix[0])
steps = 0
left, right = 0, min(N, M) - 1
diag_indx = -1
while left <= right:
steps += 1
mid = (left + right) // 2
if matrix[mid][mid] == K:
return True, 1
elif matrix[mid][mid] < K:
diag_indx = mid
left = mid + 1
else:
right = mid - 1
if diag_indx >= 0 and diag_indx < N:
steps += 1
row = matrix[diag_indx]
pos = b.bisect_left(row, K)
if pos < M and row[pos] == K:
return True, steps
if diag_indx >= 0 and diag_idx < M:
steps += 1
col_values = [matrix[i][diag_idx] for i in range(N)]
pos = b.bisect_left(col_values, K)
if pos < N and col_values[pos] == K:
return True, steps
if diag_indx + 1 < N:
steps += 1
row = matrix[diag_indx + 1]
pos = b.bisect_left(row, K)
if pos < M and row[pos] == K:
return True, steps
if diag_indx + 1 < M:
steps += 1
col_values = [matrix[i][diag_indx + 1] for i in range(N)]
pos = b.bisect_left(col_values, K)
if pos < N and col_values[pos] == K:
return True, steps
return False, steps
def generate_matrix(N, M):
"""
Генерирует матрицу N x M со случайными числами
"""
matrix = [[0] * M for g in range(N)]
matrix[0][0] = r.randint(1, 10)
for j in range(1, M):
matrix[0][j] = matrix[0][j-1] + r.randint(1, 8)
for i in range(1, N):
for j in range(M):
min_val = matrix[i-1][j]
if j > 0:
min_val = max(min_val, matrix[i][j-1])
matrix[i][j] = min_val + r.randint(1, 8)
return matrix
def print_matrix(matrix):
"""Вывод матрицы"""
for row in matrix:
print("\t".join(map(str, row)))
def main():
N = int(input("Введите количество строк N: "))
M = int(input("Введите количество столбцов M: "))
matrix = generate_matrix(N, M)
print("\nСгенерированная матрица:")
print_matrix(matrix)
K = int(input("\nВведите число для поиска: "))
found, steps = search_binary_diagonal(matrix, K)
if found:
print(f"\nЧисло {K} найдено \nКоличество шагов: {steps}")
else:
print(f"\nЧисло {K} не найдено \nКоличество шагов: {steps}")
if __name__ == "__main__":
main()