这道题好像很多人用了 dfs,我也是。
我觉得我用的方法比较简单,来分享一下。
我就是简单地分组标记,然后暴搜判断。
#include <bits/stdc++.h>
//#define int long long
using namespace std;
int n,m;
char a[1010][1010];
int vis[1010][1010];
int sum,mx;
const int fx[4] = {-1,0,0,1},fy[4] = {0,-1,1,0};
void dfs(int x,int y,int z)
{
vis[x][y] = z;
sum++;
if (a[x+1][y] == '#' || a[x-1][y] == '#' || a[x][y-1] == '#' || a[x][y+1] == '#') return ;
for (int i = 0;i < 4;i++)
{
int xx = x + fx[i],yy = y + fy[i];
if (xx >= 1 && xx <= n && yy >= 1 && yy <= m && a[xx][yy] != '#' && vis[xx][yy] != z) dfs(xx,yy,z);
}
}
signed main()
{
cin >> n >> m;
for (int i = 1;i <= n;i++) scanf("%s",a[i]+1);
int tot = 0;
for (int i = 1;i <= n;i++)
for (int j = 1;j <= m;j++)
if (!(a[i][j] == '#' || vis[i][j]))
{
sum = 0;
dfs(i,j,++tot);
mx = max(mx,sum);
}
cout << mx;
return 0;
}
本文分享了一种简单方法,通过深度优先搜索(DFS)在给定的二维字符矩阵中,标记可通行区域并计算从起点到终点的最大路径数量。作者使用vis数组记录访问状态,避免重复遍历。
377






