8 条题解

  • 2
    @ 2024-10-13 9:34:11
    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int n,m,ans;
    int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}};
    char w[115][115];
    struct point{  int px,py;  };
    queue<point> que;
    void bfs(int tx,int ty){
    	w[tx][ty]='.';
    	que.push((point){tx,ty});
    	while(!que.empty()){
    		point p=que.front();
    		que.pop();
    		for(int i=0;i<8;i++){
    			int nx=p.px+dir[i][0];
    			int ny=p.py+dir[i][1];
    			if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&w[nx][ny]=='W'){
    				w[nx][ny]='.';
    				que.push((point){nx,ny});
    			}
    		}	
    	}
    }
    signed main(){
    	cin>>n>>m;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			cin>>w[i][j];	
    		}	
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			if(w[i][j]=='W'){
    				bfs(i,j);
    				ans++;
    			}	
    		}	
    	}
    	cout<<ans;	
    }
    
    • 2
      @ 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;
      }
      
      • 1
        @ 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
          @ 2026-4-20 18:37:57

          #include<bits/stdc++.h> #define int long long using namespace std; int n,m,ans; int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}}; char w[115][115]; struct point{ int px,py; }; queue que; void bfs(int tx,int ty){ w[tx][ty]='.'; que.push((point){tx,ty}); while(!que.empty()){ point p=que.front(); que.pop(); for(int i=0;i<8;i++){ int nx=p.px+dir[i][0]; int ny=p.py+dir[i][1]; if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&w[nx][ny]'W'){ w[nx][ny]='.'; que.push((point){nx,ny}); } } } } signed main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>w[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(w[i][j]'W'){ bfs(i,j); ans++; } } } cout<<ans; }

          - [ ] `1. - - > ###### *****~~~~*****`
          • 0
            @ 2026-4-20 18:36:53

            #include<bits/stdc++.h> #define int long long using namespace std; int n,m,ans; int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}}; char w[115][115]; struct point{ int px,py; }; queue que; void bfs(int tx,int ty){ w[tx][ty]='.'; que.push((point){tx,ty}); while(!que.empty()){ point p=que.front(); que.pop(); for(int i=0;i<8;i++){ int nx=p.px+dir[i][0]; int ny=p.py+dir[i][1]; if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&w[nx][ny]'W'){ w[nx][ny]='.'; que.push((point){nx,ny}); } } } } signed main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>w[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(w[i][j]'W'){ bfs(i,j); ans++; } } } 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
                @ 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; //结束
                }
                
                • 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
                  标签
                  递交数
                  142
                  已通过
                  63
                  上传者