思路:将矩阵分成嵌套的很多个圈;这样每一个圈的相对位置的值都和第一个位置的值有关系。分别求出每一个圈的第一个位置就好啦!
#include<bits/stdc++.h>
using namespace std;
#define pb emplace_back
#define mp make_pair
#define eps 1e-8
typedef long long ll;
const int maxn = 1e3+ 7;
const ll mod = 1e4;
int m, n;
int work(int x, int y)
{
int res = 0;
int t = n + m - 2;
for(int i = 1; i <= (min(n, m) + 1) / 2; i ++)
{
if(x == i || y == i || x == n + 1 - i || y == m + 1 - i)
{
if(x == i)
{
res += y - i + 1;
break;
}
if(x == n + 1 - i)
{
res += m * 2 + 4 - y + n - i * 5;
break;
}
if(y == m + 1 - i)
{
res += m - 2 * i + 2 + x - i;
}
if(y == i)
{
res += 2 * (m - 2 * i + 2) + n - 2 * i + n - x - i + 1;
}
break;
}
else
res += 2 * t, t -= 4;
}
return res;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++)
{
printf("%4d ", work(i, j));
}
printf("\n");
}
}