1. 题目来源
链接:最大黑色区域
2. 题目说明
3. 题目解析
方法一:dfs+递归+常规解法
深搜小变形,从左上角开始,找到一个黑点(map[i,j]=1
),然后 dfs(i,j)
,dfs
到的点置为 0,一次 dfs
完毕得到一个返回值 max
,就是这个黑区域的面积。主程序中通过打擂台记录最大的 max
给 ans
,再找(穷举)下一个黑点继续dfs
即可。
这道题能够证明 dfs
解是连通的,也很容易想到该点。
判断时漏了一个等号,坑了有 1 分钟的 TLE
,真是人才…
参见代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
int n, m, ans = 1, mmax;
char map[105][105];
int dir[4][2] = {
0, 1,
1, 0,
0, -1,
-1, 0
};
void dfs(int x0, int y0) {
for (int i = 0; i < 4; ++i) {
int x = x0 + dir[i][0];
int y = y0 + dir[i][1];
if (map[x][y] == '1') {
map[x][y] = '0';
++ans;
dfs(x, y);
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> map[i][j];
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (map[i][j] == '1') {
map[i][j] = '0';
dfs(i, j);
mmax = max(mmax, ans);
ans = 1;
}
}
}
cout << mmax << endl;
return 0;
}