题解
2023-09-12 20:24:56
发布于:四川
11阅读
0回复
0点赞
简单dfs染色法,先从每一个点开始 dfs 染色成是格子,然后发现边边的水格不算,从边边开始 dfs 染色,染成不是答案的格子。
代码:
#include <iostream>
#include <vector>
using namespace std;
const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};
void dfs(const int n,const int m,const int x,
const int y,vector<vector<char>> &a,
const char t){//染色块 。t为要染成什么颜色
if (x<0 || x>=n || y<0 || y>=m || a[x][y]==t || a[x][y]=='*'){
return;
}
a[x][y]=t;
for (int i=0;i<4;++i){
int tx=x+dx[i],ty=y+dy[i];
dfs(n,m,tx,ty,a,t);
}
}
int main(){
int n,m;
cin >> n >> m;
vector<vector<char>> a(n,vector<char>(m));
for (int i=0;i<n;++i){
for (int j=0;j<m;++j){
cin >> a[i][j];
}
}
for (int i=0;i<n;++i){
for (int j=0;j<m;++j){
if (a[i][j]=='0'){
dfs(n,m,i,j,a,'w');
}
}
}
for(int i=0;i<n;++i){
dfs(n,m,i,0,a,'0');
dfs(n,m,i,m-1,a,'0');
}
for(int i=0;i<m;++i){
dfs(n,m,0,i,a,'0');
dfs(n,m,n-1,i,a,'0');
}
int ans=0;
for (const auto &item1 : a){
for (const auto &item2 : item1){
if (item2=='w'){
++ans;
}
// cout<<item2<<" ";//debug
}
// cout<<endl;//debug
}
cout<<ans<<endl;
return 0;
}
全部评论 1
厉害厉害
2023-09-12 来自 四川
0
有帮助,赞一个