Files
4laba/task1(2).py
2026-04-01 11:45:09 +03:00

107 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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_indx < M:
steps += 1
col_values = [matrix[i][diag_indx] 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()