class Solution {
public:
int minArea(vector<vector<char>>& image, int x, int y) {
const int M = image.size(), N = image[0].size();
// h: 遍历列还是行; i, j: 二分范围;low high: 检查有无1的范围;delta: 没查到1后往哪边动
const auto bs = [&](bool h, int i, int j, int low, int high, int delta) {
while (i < j) {
int k = low, mid = i + (j - i) / 2;
// 沿着一直搜索直到找到1
while (k < high && (h ? image[mid][k] : image[k][mid]) == '0') ++k;
// 是否遍历到了边界,到了意味着此行/列没有1
if (k == high) i = mid + delta;
else j = mid;
}
return i;
};
int up = bs(true, 0, x, 0, N, true, 1);
int down = bs(true, x + 1, M, 0, N, -1);
int left = bs(false, 0, y, up, down, 1);
int right = bs(false, y + 1, N, up, down, -1);
}
};