题目
在一个大小为 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; }