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