2 条题解
-
1fedoralxy LV 3 @ 2024-7-24 15:50:45
一个个遍历 W 肯定会超时,于是我们便不从 W 入手,转而从 _ 入手。
先用搜索计算连通块有多少部分,并把每一部分标上号,计算其连通块的个数,储存在数组里。
然后遍历每一个 W,看它的四周(上下左右)的标记的那一部分连通块的个数,然后把它们累加(注意是同一部分的只要加一次),最后加上本身的1就是答案。
-
02024-7-23 23:28:58@
//t1 #include<bits/stdc++.h> using namespace std; const int N=1e3+10; int n,m,ans,s[N][N]; bool ff[N][N],f[N][N],t[N][N]; char a[N][N]; int dx[15]={0,-1,0,0,1}; int dy[15]={0,0,-1,1,0}; void DFS_FindGround(int x,int y) { if(f[x][y]==1)return; ans++; f[x][y]=1; for(int i=1;i<=4;++i) { int xx=x+dx[i]; int yy=y+dy[i]; if(xx>=1&&yy>=1&&xx<=n&&yy<=m && a[xx][yy]=='_') { DFS_FindGround(xx,yy); } } return; } void DFS(int x,int y) { if(ff[x][y]==1)return; ff[x][y]=1; for(int i=1;i<=4;++i) { int xx=x+dx[i]; int yy=y+dy[i]; if(xx>=1&&yy>=1&&xx<=n&&yy<=m) { if(t[xx][yy]==0 && a[xx][yy]=='W') t[xx][yy]=1,s[xx][yy]+=ans; else if(a[xx][yy]=='_') DFS(xx,yy); } } return; } int main() { cin>>n>>m; 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]=='_' && f[i][j]==0) { ans=0; DFS_FindGround(i,j); memset(ff,0,sizeof(ff)); memset(t,0,sizeof(t)); DFS(i,j); } } } for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { if(a[i][j]=='_')printf("_"); else printf("%d",(s[i][j]+1)%10); } printf("\n"); } return 0; }
- 1
信息
- ID
- 3088
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 66
- 已通过
- 16
- 上传者