110 lines
2.9 KiB
Python
110 lines
2.9 KiB
Python
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, steps
|
||
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)]
|
||
current = 1
|
||
|
||
for i in range(N):
|
||
for j in range(M):
|
||
if i == 0 and j == 0:
|
||
matrix[i][j] = current
|
||
current += r.randint(1, 8)
|
||
else:
|
||
matrix[i][j] = current
|
||
current += 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)
|
||
|
||
all_numbers = []
|
||
for row in matrix:
|
||
all_numbers.extend(row)
|
||
|
||
unique_numbers = set(all_numbers)
|
||
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() |