k列的左边都是比第k列小的数,右边从左到右从上到下依次排就行了
#include <iostream>
#include <cstdio>
const int MAX = 505;
int arr[MAX][MAX];
int main()
{
int n, k, t = 1;
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= k - 1; ++j)
{
arr[i][j] = t++;
}
}
int sum = 0;
for (int i = 1; i <= n; ++i)
{
for (int j = k; j <= n; ++j)
{
arr[i][j] = t++;
if (j == k)
{
sum += arr[i][j];
}
}
}
printf("%d\n", sum);
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
printf("%d ", arr[i][j]);
}
puts("");
}
return 0;
}