题目

在一个大小为 n×n 网格的森林里,每个格子中,都放有一个宝藏,其中 n 是奇数。
求把这些宝藏都集中到同一个单元格中的最小移动次数。
在一次移动中,可以选择某个单元格中的一个宝藏,将其移动到相邻的 8 个格子中的一个。
不能将宝藏移出森林。

解题思路

将所有宝藏都移动到网格的最中心的位置。

中心的相邻的第 1 层有 2 * 4 = 8 个格子,每个格子移动到中心的最少次数都是 1。
中心的相邻的第 2 层有 4 * 4 = 16 个格子,每个格子移动到中心的最少次数都是 2。
依此类推,中心的相邻的第 i 层有 (2 * i) * 4 个格子,每个格子移动到中心的最少次数都是 i,这些格子移动总次数为 8 * i * i
一共有 (n-1)/2 层。
将这些距离相加即为所求。

C++代码

#include<iostream>
using namespace std;

int main(){
    int t, n;
    cin >> t;
    while(t--){
        cin >> n;
        long long ans = 0;
        int k = (n-1)/2;
        for(int i=1; i<=k; ++i){
            ans += 8LL*i*i;
        }
        cout << ans << endl;
    }
    return 0;
}