Заполнение матрицы числами определенным образом в C++?

У меня есть программа, в которой я должен напечатать матрицу, например, для n=5 (пользователь может ввести любое положительное целое число n<20) следующим образом:

0 20 19 17 14
1 0 18 16  13
2 5 0  15  12
3 6 8  0   11
4 7 9  10   0

Моей первоначальной идеей было заполнение главной диагонали нулями, а не от 1 до (n*n-n)/2 заполнить матрицу этими элементами под главной диагональю (i>j), и из (n*n-n)/2 до n - элементы над главной диагональю (i<j), Тем не менее, программа не работает, как ожидалось. Я хотел бы спросить, почему это происходит.

1 ответ

Помимо множественного объявления i и a, ваши циклы продолжают присваивать значения одной и той же переменной.

// changed i to k because of double declaration
for(int k=1; k<(n*n-n)/2; k++)
{
    a[i][j]=k;
}

Лучший способ сделать это будет:

int number = 1;
int col = 0, row = 1;
while(col < n && row < n){
    for(int pos = row; pos < n; ++pos){
        mat[col][pos] = number++;
    }
    ++col;++row;
}

col = n-1;
row = n-2;
while(col >= 0 && row >= 0){
    for(int pos = row; pos >= 0; --pos){
        mat[col][pos] = number++;
    }
    --col;--row;
}
Другие вопросы по тегам