Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Определение матрицы
Матрица – это прямоугольная таблица элементов. Ну а если простым языком – таблица
чисел.
Элементы, для которых i=j (a11, a22, .. ) образуют главную диагональ матрицы, и
называются диагональными.
Умножение матриц
Определитель матрицы
Определитель, о же детерминант – одно из основных понятий линейной алгебры. Когда-
то люди придумали линейные уравнения, а за ними пришлось выдумать и определитель. В
итоге, разбираться со всем этим предстоит вам, так что, последний рывок!
Для такой матрицы значение определителя равно сумме произведений элементов главной
диагонали и произведений элементов лежащих на треугольниках с гранью параллельной
главной диагонали, от которой вычитается произведение элементов побочной диагонали
и произведение элементов лежащих на треугольниках с гранью параллельной побочной
диагонали.
Все алгоритмы, применяемые для нахождения кратчайшего пути можно разделить на два
типа: алгоритмы на графах и алгоритмы на массивах.
Итак, как было отмечено выше, задачу о нахождении кратчайшего пути можно
рассматривать при помощи математического объекта, называемого графом. Граф задается
множеством точек (вершин) и множеством линий (ребер), соединяющих все или часть
этих точек.
Только что описанный алгоритм Дейкстры применим для нахождения кратчайшего пути
между двумя заданными вершинами s и t. Что бы найти кратчайшие пути между всеми
парами вершин, можно n-раз воспользоваться алгоритмом Дейкстры, причем каждый раз в
качестве начальной вершины s будут браться различные вершины. В этом случае время,
необходимое для вычислений, будет пропорционально n3. Поэтому, если задача о
нахождении кратчайшего пути имеет большую размерность, то ее не возможно решить с
помощью последовательного применения этого алгоритма.
Есть совершенно иной подход к задаче нахождения кратчайших путей между всеми парами
вершин. Он сэкономит почти 50% времени по сравнению с n-кратным применением
алгоритма Дейкстры. Метод был предложен первоначально Флойдом (1962 г.) и развит
Мерчлендом. Он базируется на использовании последовательности из n преобразований
(итераций) начальной матрицы весов С. При этом на k-й итерации матрица представляет
длины кратчайших путей между каждой парой вершин с тем ограничением, что путь между
xi и xj (для любых xi и xj) содержит в качестве промежуточных только вершины из
множества {x1, x2,..., xk}.
Для начала разберемся с входными данными: у нас есть матрица элементов, где 0 —
пустые клетки, а 1 — стенки.
При вводе меняем «1» на "-1" (этого требует алгоритм)
Далее нужно выбрать ячейку, с которой начнется обход
Рекурсивно обойти лабиринт от выбранной ячейки, вставляя в ячейку текущий «уровень
волны»
rdl = list(map(int,input().split()))
n, m = rdl
for i in range(n):
rdl = input()
cur = []
for k in range(m):
if int(rdl[k]) == 1:
cur.append(-1)
else:
cur.append(int(rdl[k]))
lab.append(cur)
lab[x][y] = cur
if y+1 < m:
Если есть такая возможность, то проверяем, нет ли там стенки или текущий «уровень
воды» меньше, чем в ячейке справа :
voln(x,y+1,cur+1,n,m,lab)
Теперь нужно точно также проверить возможность пройти вниз, влево и вверх:
if x+1<n:
if lab[x+1][y] == 0 or (lab[x+1][y] != -1 and lab[x+1][y] > cur):
voln(x+1,y,cur+1,n,m)
if x-1>=0:
if lab[x-1][y] == 0 or (lab[x-1][y] != -1 and lab[x-1][y] > cur):
voln(x-1,y,cur+1,n,m)
if y-1>=0:
if lab[x][y-1] == 0 or (lab[x][y-1] != -1 and lab[x][y-1] > cur):
voln(x,y-1,cur+1,n,m)
return lab
Готовая программа:
def main():
lab = []
rdl = list(map(int,input().split()))
n, m = rdl
for i in range(n):
rdl = input()
cur = []
for k in range(m):
if int(rdl[k]) == 1:
cur.append(-1)
else:
cur.append(int(rdl[k]))
lab.append(cur)
rdl = list(map(int,input().split()))
x1, y1 = rdl[0]-1, rdl[1]-1
rdl = list(map(int,input().split()))
x2, y2 = rdl[0]-1, rdl[1] -1
lab = voln(x1,y1,1,n,m,lab)
if lab[x2][y2] > 0:
print("Mozhet")
else:
print("Ne mozhet")
def voln(x,y,cur,n,m):
lab[x][y] = cur
if y+1<m:
if lab[x][y+1] == 0 or (lab[x][y+1] != -1 and lab[x][y+1] > cur):
voln(x,y+1,cur+1,n,m,lab)
if x+1<n:
if lab[x+1][y] == 0 or (lab[x+1][y] != -1 and lab[x+1][y] > cur):
voln(x+1,y,cur+1,n,m,lab)
if x-1>=0:
if lab[x-1][y] == 0 or (lab[x-1][y] != -1 and lab[x-1][y] > cur):
voln(x-1,y,cur+1,n,m,lab)
if y-1>=0:
if lab[x][y-1] == 0 or (lab[x][y-1] != -1 and lab[x][y-1] > cur):
voln(x,y-1,cur+1,n,m,lab)
return lab
main()