5 条题解

  • 1
    @ 2023-4-2 11:02:26
    #include<bits/stdc++.h>//万能头
    using namespace std;
    char mp[165][165];//水塘
    int n,m,s,v[165][165];
    int d[8][2]={1,0,0,1,-1,0,0,-1,1,-1,-1,1,-1,-1,1,1}; //8方向
    void p(int x,int y)
    {
    int i,dx,dy;
    v[x][y]=1;//已遍历过
    for(i=0;i<=7;i++)
    {
    dx=x+d[i][0];//往8个方向
    dy=y+d[i][1];//继续扩展
    if(mp[dx][dy]=='W'&&v[dx][dy]==0)//若未遍览过 且 为水坑则继续
    {
    p(dx,dy);//继续搜索
    }
    }
    }
    int main()
    {
    cin>>n>>m;//输入n,m
    s=0;//水坑数
    for(int i=1;i<=n;i++)
    {
    for(int j=1;j<=m;j++)
    {
    cin>>mp[i][j];//输入
    }
    }
    for(int i=1;i<=n;i++)//
    {
    for(int j=1;j<=m;j++)
    {
    if(mp[i][j]=='W'&&v[i][j]==0)//若未遍览过 且 为水坑则继续
    {
    p(i,j);//搜索
    s++;//搜索完毕,水塘总数+1
    }
    }
    }
    cout<<s;//输出s
    return 0; //结束
    }
    
    • 1
      @ 2022-10-15 16:38:02
      #include <iostream>
      using namespace std;
      
      int dx[8] = {-1,  -1, -1,   0,  0,   1,  1,  1};
      int dy[8] = {-1,  0,   1,  -1,  1,  -1,  0,  1};
      
      int n, m;
      char a[105][105];
      
      void dfs(int x, int y,int cnt)
      {
      	// 染色标记
      	a[x][y] = '.';
      	for (int i = 0; i < 8; i++)
      	{
      		int nx = x + dx[i];
      		int ny = y + dy[i];
      		if (nx <= n and nx >= 1 and 1 <= ny and ny <= m and a[nx][ny] == 'W'){
      			dfs(nx,ny,cnt+1);
      		}
      	}
      }
      
      int main()
      {
          cin >> n >> m;
          for (int i = 1; i <= n; i++)
          {
          	for (int j = 1; j <= m; j++)
          	{
      	    	cin >> a[i][j];
          	}
          }
          int ans = 0;
          for (int i = 1; i <= n; i++)
          {
          	for (int j = 1; j <= m; j++)
          	{
          		// 寻找连通块,记录个数
          		if (a[i][j] == 'W')
          		{
          			dfs(i,j,1);
          			ans++;
          		}
          	}
          }
          cout << ans << endl;
          return 0;
      }
      
      • 0
        @ 2024-3-25 20:14:13

        这是一道大大滴难题

        经典DFS连通块问题

        直接用那个模板套进去就可以得分了

        不抄代码,人人有责

        好吧好吧,为了满足某些蒟蒻的需求,奉送代码一篇

        #include<bits/stdc++.h>
        using namespace std;
        int n,m,Lakemap[500][500];
        void dfs(int x,int y){
        	if(Lakemap[x][y]==0)return;
        	if(x<=0 || x>n || y<=0 || y>m ){
        		return ;
        	}
        	Lakemap[x][y]=0;
        	dfs(x-1,y);
        	dfs(x-1,y+1);
        	dfs(x-1,y-1);
        	dfs(x,y-1);
        	dfs(x,y+1);
        	dfs(x+1,y+1);
        	dfs(x+1,y-1);
        	dfs(x+1,y);
        } 
        int main(){
        	cin>>n>>m;
        	for(int i=1;i<=n;i++){
        		for(int j=1;j<=m;j++){
        			char ch;
        			cin>>ch;
        			if(ch=='W')Lakemap[i][j]=1;
        			else Lakemap[i][j]=0;
        		}
        	}
        	int ans=0;
        	for(int i=1;i<=n;i++){
        		for(int j=1;j<=m;j++){
        			if(Lakemap[i][j]==1){
        				dfs(i,j);
        				ans+=1;
        			}
        		}
        	}
        	cout<<ans;
        }
        
        • 0
          @ 2023-12-17 16:51:32
          col1 col2 col3
          #include<bits/stdc++.h>
          using namespace std;
          int xx[9]={0,-1,-1,-1,0,0,1,1,1};//x方向
          int xy[9]={0,-1,0,1,-1,1,-1,0,1};//y方向
          int n,m,ans;
          char a[105][105];
          void dfs(int x,int y)
          {
          int r,c;
          a[x][y]='.';
          for (int i=1;i<=8;i++)
          {
          r=x+xx[i];
          c=y+xy[i];
          if (r<1 r>n
          continue;
          a[r][c]='.';
          dfs(r,c);
          }
          int main()
          {
          scanf("%d %d\n",&n,&m);
          for (int i=1;i<=n;i++)
          {
          for (int j=1;j<=m;j++)
          cin>>a[i][j];
          }
          ans=0;
          for (int i=1;i<=n;i++)
          {
          for (int j=1;j<=m;j++)
          {
          if (a[i][j]=='W')
          {
          ans++;
          dfs(i,j);
          }
          printf("%d\n",ans);
          return 0;
          }
          • [ ]
          • 0
            @ 2022-8-5 11:40:05

            #include <bits/stdc++.h> using namespace std; char a[108][108]; bool a1[108][108]; int n,m,sum=0; void DFS(int i,int j) { if(a1[i][j]true) { a1[i][j]=false; DFS(i+1,j+1); DFS(i-1,j-1); DFS(i-1,j+1); DFS(i+1,j-1); DFS(i,j+1);
            DFS(i,j-1); DFS(i-1,j); DFS(i+1,j); } else return; } int main() { cin>>n>>m; memset(a1,false,sizeof(a1)); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { cin>>a[i][j]; if(a[i][j]
            'W') a1[i][j]=true; } } for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(a1[i][j]==true) { DFS(i,j); sum++; } } } cout<<sum<<endl;

            return 0;
            

            }

            • 1

            信息

            ID
            2617
            时间
            1000ms
            内存
            256MiB
            难度
            4
            标签
            递交数
            39
            已通过
            19
            上传者