int min_3(int a, int b, int c)// Возвращает минимальное из 3-х элементов.
{
int min;
if((a<b)&&(a<c)) min = a;
elseif(b<c) min = b;
else min = c;
return min;
}
int ind_min_3(int a, int b, int c)// Возвращает индекс минимального из 3-х элементов. Если a - минимальное, то 1; если b, то 2; если c, то 3.
{
int ind;
if((a<b)&&(a<c)) ind =1;
elseif(b<c) ind =2;
else ind =3;
return ind;
}
void build_path(int** Arr, int i, int j)// Ф-ция построения пути.
{
cout<<"["<<i<<","<<j<<"] ";// Выводим индекс элемента.
if(i==0&& j==0)
return;// Выходим, если оказались в начале пути.
int k;// Переменная для определения движения.
if(i>0&& j>0)
k = ind_min_3(Arr[i-1][j],Arr[i][j-1],Arr[i-1][j-1]);// Ищем индекс минимального из элементов на 1 выше, на 1 левее, и на 1 выше по диагонали
// среди элементов с индексами i>0 и j>0 для определения направления движения.
if(i>0&& j==0)// Если находимся в нулевой строке, то двигаемся только влево.
k =1;
if(i==0&& j>0)// Если находимся в нулевом столбце, то двигаемся только вверх.
k =2;
switch(k)// Выбираем куда двигаться.
{
case1:
build_path(Arr, i-1,j);
break;
case2:
build_path(Arr, i,j-1);
break;
case3:
build_path(Arr, i-1,j-1);
break;
}
}
int main(){
srand(time(0));// Генерация случайных чисел.
cin>> N;// Считываем количество элементов в матрице. (NxN)
int**A =newint*[N];// Объявляем динамический массив А.
int**B =newint*[N];// Объявляем динамический массив B.
for(int i =0; i < N; i++){
A[i]=newint[N];
B[i]=newint[N];
}
for(int i=0; i<N; i++)// Заполняем матрицу A случайными значениями.
for(int j=0; j<N; j++){
if((i==0)&&(j==0)) A[i][j]=0;// Элемент с индексом [0,0] всегда равен 0.
else
A[i][j]=rand()%10;
B[i][j]=0;
}
cout<<"Сгенерированный массив:"<< endl;
for(int i=0; i<N; i++){// Вывод матрицы A.
for(int j=0; j<N; j++){
cout<< A[i][j]<<" ";
}
cout<< endl;
}
cout<<"---"<< endl;
cout<<"Массив стоимости путей:"<< endl;
for(int i=0; i<N; i++)// Заполняем матрицу стоимостей B.
for(int j=0; j<N; j++)
{
if(i==0&& j==0)
B[i][j]=0;// Для элемента с индексами [0,0] стомость в B равна 0.
else
{
if(i==0)
{
B[i][j]=B[i][j-1]+A[i][j];// Для всех элементов из 0-й строки стомость равна сумме стоимости из матрицы A и стоимости пути на предыдущем шаге (из B).
}
else
{
if(j==0)
{
B[i][j]=B[i-1][j]+A[i][j];// Для всех элементов из 0-го столбца стомость равна сумме стоимости из матрицы A и стоимости пути на предыдущем шаге (из B).
}else
B[i][j]=A[i][j]+min_3(B[i-1][j],B[i][j-1],B[i-1][j-1]);// Иначе (i>0, j>0) стоимость равна сумме стоимости из A и минимальному из
// стоимостей в B выше на 1 строку, или левее на 1 столбец, или выше на
// 1 строку и левее на 1 столбец (выше по диагонали).
}
}
}
for(int i=0; i<N; i++){// Распечатываем матрицу стоимостей B.
for(int j=0; j<N; j++){
cout<< B[i][j]<<" ";
}
cout<< endl;
}
cout<< endl <<"Маршрут (в обратном порядке):"<< endl;
build_path(B, N-1, N-1);// Восстанавливаем маршрут рекурсивно. Параметры: массив, индексы элемента, с которого начинаем восстанавливать.