2 条题解

  • 1
    @ 2024-7-24 15:50:45

    一个个遍历 W 肯定会超时,于是我们便不从 W 入手,转而从 _ 入手。

    先用搜索计算连通块有多少部分,并把每一部分标上号,计算其连通块的个数,储存在数组里。

    然后遍历每一个 W,看它的四周(上下左右)的标记的那一部分连通块的个数,然后把它们累加(注意是同一部分的只要加一次),最后加上本身的1就是答案。

    • 0
      //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
      上传者