for(int i=0; i<n; i++)
{
a[i][i]=i;
b[i][i]=0;
}
Первое: тут явно не все элементы массивов будут инициализированны. Посмотрите как вы выводите двумерный массив на печать в конце:
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
cout<<b[i][j]<<" ";
}
cout<<endl;
}
Аналогично нужно проводить заполнение при помощи двух циклов. Ещё наверное стоит заполнить матрицу а случайными целыми (функция rand()) и выводить обе матрицы а и b.
Заполнение:
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
a[i][j]=rand();
b[i][j]=-1;
}
}
Далее во втором цикле начинаем обход столбцов со второго.
for(int j=1; j<n; j++)
Почему не с первого с индексом 0? Ведь нужно получить ответ для каждого элемента в матрице b.
Как только получите правильное заполнение надо взять листочек бумаги и подумать как получать минимум по области тета. В первом столбце матрицы b в i-ой строке явно стоит элемент который меньше всех остальных пройденных до него. Из этого следует, что можно использовать промежуточную матрицу С у которой элемент i,j это минимум в данной части столбца j от его начала до строки i. И тогда если нужно получить b(i,j) нужно просто взять минимальный из элементов на "диагональной" границе области тета в матрице С.