開啟章節選單

10908 Largest Squares

題目敘述

給定一個字元矩形,您必須找出最大正方形的邊的長度。 在其中正方形內的所有字元皆相同,並且正方形的中心(兩個對角線的交點)位於位置(r, c)。 矩形的高度和寬度分別為M和N。矩形的左上角座標為(0, 0),右下角座標為(M-1, N-1)。

例如:給定中心位置(1, 2),此最大正方形邊長為3。

abbbaaaaaa
abbbaaaaaa
abbbaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaccaaaaaa
aaccaaaaaa

輸入說明

輸入第一行為一個整數T (T < 21),T代表有幾組測資。 每組測資的第一行包含三個整數M,N (1 <= M, N <= 100),Q (Q < 21)。 其中M,N表示矩形的高度和寬度,Q代表詢問的數量。 接下來M行每行N個字元,代表輸入的字元矩形。 接下來Q行,每行包含兩個整數r和c。

輸出說明

對於每組測資。 第一行輸出M,N,Q值,以空格分開。 接下來Q行,輸出以(r, c)當中心所對應的最大正方形邊長。

解題思路

每次向左上方擴大一格掃,只要在範圍內有和中心點不同的字元就輸出上次掃的邊長,如果碰到邊界就停止,直接輸出

程式碼

#include <bits/stdc++.h>
using namespace std;

int main() {
  int n;
  cin >> n;
  while (n--) {
    int a, b, d;
    cin >> a >> b >> d;
    char arr[a][b];
    for (int i = 0; i < a; i++)
      for (int j = 0; j < b; j++) cin >> arr[i][j];
    cout << a << ' ' << b << ' ' << d << endl;
    while (d--) {
      int x, y, fx, fy, ex, ey, t = 1, ans = 1;
      cin >> x >> y;
      char carr = arr[x][y];
      while (1) {
        if (x - t >= 0 && y - t >= 0 && x + t < a && y + t < b)
          fx = x - t, fy = y - t, ex = x + t, ey = y + t, t++;
        else
          break;
        for (int i = fx; i <= ex; i++)
          for (int j = fy; j <= ey; j++)
            if (arr[i][j] != carr) break;
        ans += 2;
      }
      cout << ans << endl;
    }
  }
  return 0;
}