開啟章節選單
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; }