# Largest Square(UVA10908)
## [程式繳交區](https://hackmd.io/@Renektonn/Hyr5Lypdye/edit)
## 題目
[點我](https://onlinejudge.org/external/109/10908.pdf)
## 解題網站
[UVA](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1849)
[ZJ](https://zerojudge.tw/ShowProblem?problemid=e575)
## 演算法
```
1. 處理輸入
2. 讓i從0跑到50,代表正方形的半徑,若超過邊界,或i當半徑沒有成功,輸出2i-1,break
```
:::info
當break前,i-1代表最大半徑,乘2加1後即為正方形邊長,即為2(i-1)+1=2i-1
break一定會觸發,因為50當半徑一定不會成功(grid最大是100×100),這是程式的設計
:::
## 程式碼
```cpp=
/*
1. 處理輸入
2. 讓i從0跑到50,代表正方形的半徑,若超過邊界,或i當半徑沒有成功,輸出2i-3,break
*/
#include <bits/stdc++.h>
using namespace std;
char arr[100][100];
int isValid (int r, int c, int radius) {
char ch = arr[r][c];
int up = r - radius, down = r + radius, left = c - radius, right = c + radius;
for (int i = up; i <= down; i++) {
for (int j = left; j <= right; j++) {
if (ch != arr[i][j]) return 0;
}
}
return 1;
}
int main() {
int t;
cin >> t;
while (t--) {
int m, n, q;
cin >> m >> n >> q;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> arr[i][j];
}
}
cout << m << " " << n << " " << q << endl;
for (int i = 1; i <= q; i++) {
int r, c;
cin >> r >> c;
if (r < 0 or r >= m or c < 0 or c >= n) {
cout << 0 << endl;
continue;
}
for (int j = 0; j <= 50; j++) {
if (r - j < 0 or r + j >= m or c - j < 0 or c + j >= n or !isValid(r, c, j)) {
cout << 2 * j - 1 << endl;
break;
}
}
}
}
return 0;
}
```