对着下面这一坨代码思考了一上午
#include<bits/stdc++.h>
//#pragma GCC optimize(2)
using namespace std;
const int N=1010;
int n,m,ans,cnt,mj[N],bh[N][N];
bool f[N][N],vis[N][N],fl[N*N];
//bh是[i][j]所在的房间编号,cnt当前是第几个房间,mj[i]房间编号x的房间的面积,fl用于判重
string x;
void dfs(int i,int j){
bh[i][j]=cnt;
//四个方向深搜
if(f[i+1][j]==1&&i+1<=n&&!vis[i+1][j])
{
mj[cnt]++;
vis[i+1][j]=1;
dfs(i+1,j);
}
if(f[i][j+1]==1&&j+1<=m&&!vis[i][j+1])
{
mj[cnt]++;
vis[i][j+1]=1;
dfs(i,j+1);
}
if(f[i-1][j]==1&&i-1>0&&!vis[i-1][j])
{
mj[cnt]++;
vis[i-1][j]=1;
dfs(i-1,j);
}
if(f[i][j-1]==1&&j-1>0&&!vis[i][j-1])
{
mj[cnt]++;
vis[i][j-1]=1;
dfs(i,j-1);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>x;
for(int j=0;j<m;j++){
if(x[j]=='.') f[i][j+1]=1;
else {f[i][j+1]=0;bh[i][j+1]=0;}
//不想判断字符
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
{
if(!vis[i][j]&&f[i][j]){
cnt++;
mj[cnt]++;
vis[i][j]=1;
dfs(i,j);
}
}
}
/*
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<bh[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<mj[bh[i][j]]<<" ";
}
cout<<endl;
}
cout<<endl;
*/
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ans=1;//至少有自己
if(f[i][j]==0)
{
//四个方向查找,如果不是加过的房间就加上这个房间的面积
if(f[i+1][j]&&i+1<=n){
ans+=mj[bh[i+1][j]];
fl[bh[i+1][j]]=1;
}
if(f[i-1][j]&&i-1>0&&!fl[bh[i-1][j]]){
ans+=mj[bh[i-1][j]];
fl[bh[i-1][j]]=1;
}
if(f[i][j+1]&&j+1<=m&&!fl[bh[i][j+1]]){
ans+=mj[bh[i][j+1]];
fl[bh[i][j+1]]=1;
}
if(f[i][j-1]&&j-1>0&&!fl[bh[i][j-1]]){
ans+=mj[bh[i][j-1]];
}
ans%=10;
printf("%d",ans);
fl[bh[i+1][j]]=fl[bh[i-1][j]]=fl[bh[i][j+1]]=0;
}
else cout<<'.';
}
puts("");
}
return 0;
}
样例的小数据都过去了,但是后面出现了wa,,,
大概是算法写的问题
求助诸位神犇(双手合十)