Во первых, потому, что для каждого значения i ты m раз меняешь местами a[i][k] и a[i][l]. И если m чётное, по результату обменов ты получаешь массив БЕЗ изменений.
Столбцы меняются местами в массиве ОДНИМ циклом:
int k, l;
cin >> k >> l;
for (int i = 0; i < n; i++){
int t = a[i][k];
a[i][k] = a[i][l];
a[i][l] = t;
}
Во вторых, чему равно k1, когда ты делаешь a[i][k1] = a[i][k]; и a[i][l] = a[i][k1];? У тебя в k1 абсолютно произвольное значение, т.к. переменную ты не инициализировал. И при выполнении a[i][k1] происходит обращение к какой-то произвольной ячейке памяти с непредсказуемыми последствиями.
int k, l;
cin >> k >> l;
int k1;
for (int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
k1 = a[i][k];
a[i][k]=a[i][l];
a[i][l] = k1;
}
}
меняет столбцы в двумерном массиве, а
int k, l;
cin >> k >> l;
int k1;
for (int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
a[i][k1] = a[i][k];
a[i][k]=a[i][l];
a[i][l] = a[i][k1];
}
}
не меняет?
если что вот полный код:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n, m;
cin >> n >>m;
int a[100][100];
for (int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> a[i][j];
}
}
int k, l;
cin >> k >> l;
int k1;
for (int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
k1 = a[i][k];
a[i][k]=a[i][l];
a[i][l] = k1;
}
}
for (int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}