题解
2026-08-13 13:27:20
发布于:江苏
2阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,n,m,cnt,sz;
vector<vector<char>> a;
vector<vector<int>> vis;
map<int,int> mp;
int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
void dfs(int x,int y){
vis[x][y] = cnt;
sz++;
for(int i=0;i<4;i++){
int nx=x+dx[i], ny=y+dy[i];
if(nx<1 || nx>n || ny<1 || ny>m ) continue;
if(a[nx][ny]=='.' || vis[nx][ny]) continue;
dfs(nx,ny);
}
}
int main(){
cin>>t;
while(t--){
cin >> n >> m;
a.assign(n+1,vector<char>(m+1));
vis.assign(n+1,vector<int>(m+1,0));
mp.clear();
cnt = 0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin >> a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='#' && !vis[i][j]){
cnt++; sz = 0;
dfs(i,j);
mp[cnt] = sz;
}
}
}
int ans = 0;
for(int i=1; i<=n; i++){
int c = 0;
set<int> st;
for(int j=1;j<=m;j++){
if(a[i][j]=='.') c++;
if(a[i][j]=='#') st.insert(vis[i][j]);
if(i>1 && a[i-1][j]=='#') st.insert(vis[i-1][j]);
if(i<n && a[i+1][j]=='#') st.insert(vis[i+1][j]);
}
for(int id : st) c+=mp[id];
ans = max(ans,c);
}
for(int j=1; j<=m; j++){ // 枚举改变每一列,同理
int c = 0;
set<int> st;
for(int i=1;i<=n;i++){
if(a[i][j]=='.') c++;
if(a[i][j]=='#') st.insert(vis[i][j]);
if(j>1 && a[i][j-1]=='#') st.insert(vis[i][j-1]);
if(j<m && a[i][j+1]=='#') st.insert(vis[i][j+1]);
}
for(int id : st) c+=mp[id];
ans = max(ans,c);
}
cout << ans << "\n";
}
return 0;
}
这里空空如也




有帮助,赞一个