n×m 網格,矩形水塘 [l,r]×[t,b]。繞行周長 ≤ L 的封閉折線(沿網格邊),不進入水塘。求最大圈地面積(不含水塘)。n,m≤100, L≤400。
最優路徑為軸向矩形(或切角矩形)。因周長固定,面積最大化趨向正方形。水塘位置可通過坐標變換統一到右上角(鏡像對稱)。
w*h。w*h - (w-l)*(h-b)。w*h - (r-l)*(t-b)。枚舉寬 w、高 h,滿足 2*(w+h) ≤ L,按水塘相對位置計算面積,取最大值。
int l1=l, r1=r, t1=t, b1=b;
if (l+r <= m) { l1=m-r; r1=m-l; } // 水塘在左半部 → 鏡像到右
if (t+b <= n) { t1=n-b; b1=n-t; } // 水塘在下半部 → 鏡像到上
int ans=0;
for (int w=1; w<=L/2 && w<=m; w++)
for (int h=1; h<=L/2-w && h<=n; h++) {
if (w<=l1 || h<=b1) ans=max(ans, w*h);
else if (w<=r1 && h<=t1) ans=max(ans, w*h - (w-l1)*(h-b1));
else if (w>=r1 && h>=t1) ans=max(ans, w*h - (r-l)*(t-b));
}
cout<
L 即矩形周長 2(w+h),枚舉 w,h 即可。L≥2(m+n) 時直接輸出全場面積減水塘面積。Hihocoder #1042 通過幾何對稱性將水塘位置統一,枚舉矩形寬高計算三種重疊情況面積取最大。代碼簡潔,思維清晰,是網格幾何枚舉的典範。