5 solutions

  • 2
    @ 2024-1-13 20:47:59
    #include<iostream>
    #include<string>
    using namespace std;
    //用一个数组来存储相对位置
    int x[4]={-1,1,0,0};
    int y[4]={0,0,-1,1};
    int a[1000][1000],us[1000][1000],n,m,ans=0;//初始化
    void dfs(int q,int w)//用于标记细胞是否探索过
    {
     us[q][w]=1;//去过就打标记
     for(int i=0;i<4;i++)
     {
      //超长的判断(包括是否越位)
      if(q+x[i]>=0 && q+x[i]<n && w+y[i]>=0 && w+y[i]<m && us[q+x[i]][w+y[i]]==0 &&  a[q+x[i]][w+y[i]]!=0)
      {
       dfs(q+x[i],w+y[i]);//只有满足条件才能继续搜索,标记
      }
     }
    }
    int main()
    {
     string s;
     cin>>n>>m;//输入
     for(int i=0;i<n;i++)
     {
      cin>>s;//可恶的字符串
      for(int j=0;j<m;j++)
      {
       us[i][j]=0;//初始化
       a[i][j]=s[j]-48;//可恶的字符串
      }
     }
     for(int i=0;i<n;i++)
     {
      for(int j=0;j<m;j++)
      {
       if(us[i][j]==0 && a[i][j]!=0)//当是一个细胞时且没标记过
       {
        ans++;//增加
        dfs(i,j);//标记整个细胞
       }
      }
     }
     cout<<ans;//输出
     return 0;//完结散花
    }
    
    • 1
      @ 2025-2-18 13:36:46
      #include<bits/stdc++.h>
      using namespace std;
      int n, m;
      char a[105][105];
      int sum = 0;
      void dfs(int x,int y)
      {
      	int x1[4]={1, 0, -1, 0};
      	int y1[4]={0, 1, 0, -1};
      	if(x<1||x>n||y<1||y>m||a[x][y]=='0')//越界或不是细胞(与其他细胞相连)
      	{
      		return;//剪枝
      	}
      	a[x][y]='0';//将与第一个细胞相连的删掉(包括第一个细胞)
      	for(int i = 0; i < 4; i++)
      	{
      		dfs(x+x1[i], y+y1[i]);
      	}
      }
      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]!='0')
      			{
      				sum++;
      				dfs(i,j);
      			}
      		}
      			
      	}
      	cout << sum;
      	return 0;
      }
      
      • 1
        @ 2024-3-14 16:00:13
        #include <iostream>
        #include <cmath>
        using namespace std;
        int n,m,cnt=0;
        int dx[4]={-1,1,0,0};
        int dy[4]={0,0,1,-1};
        char mp[105][105];
        void dfs(int x,int y){
        	mp[x][y]='0';
        	for(int i=0;i<=3;i++){
        		int nx=x+dx[i],ny=y+dy[i];
        		if(nx>=1&&nx<=n&&ny>=1&&ny<=m
        		&&mp[nx][ny]>='1'&&mp[nx][ny]<='9') dfs(nx,ny);
        	}
        }
        int main(){
        	cin>>n>>m;
        	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]>='1'&&mp[i][j]<='9'){
        				cnt++;
        				dfs(i,j);
        			}
        		}
        	}
        	cout<<cnt<<endl;
        	return 0;
        }
        
        
        • 0
          @ 2024-1-8 13:32:46

          题意

          输入一个由数字 0-9 组成的 n×mn \times m 的细胞矩阵,找有多少个细胞

          细胞定义:一个 1-9 的数字为一个细胞,细胞的四面如果有细胞,那么算它们为一个细胞

          PS:输入的第 ii 行每个数之间没有空格

          思路

          几个简单遍历就能搞定~

          只要发现一个细胞(没被发现过),就遍历并把答案加 1

          代码

          #include <bits/stdc++.h>
          using namespace std;
          string s;
          int a[105][105],cnt,n,m;
          bool f[105][105];
          void dfs(int i,int j){
          //	printf("%d %d\n",i,j);
          	f[i][j] = 1;	// 标记遍历过了 
          	if (a[i - 1][j] && !f[i - 1][j])	dfs(i - 1,j);	// 上面是细胞且没被遍历,就遍历上面 
          	if (a[i][j - 1] && !f[i][j - 1])	dfs(i,j - 1);	// 左边同理 
          	if (a[i + 1][j] && !f[i + 1][j])	dfs(i + 1,j);	// 下面同理 
          	if (a[i][j + 1] && !f[i][j + 1])	dfs(i,j + 1);	// 右边同理 
          }
          int main(int argc, char **argv){
          	cin >> n >> m;
          	for (int i = 1;i <= n;i++){	// 输入字符串并转换 
          		cin >> s;
          		for (int j = 1;s[j - 1];j++){
          			a[i][j] = s[j - 1] - '0';
          		}
          	}
          	for (int i = 1;i <= n;i++){
          		for (int j = 1;j <= m;j++){
          			if (a[i][j] && !f[i][j]){	// 如果是细胞且没被遍历,就把细胞数加 1 并遍历 
          				cnt++;
          				dfs(i,j);
          			}
          		}
          	}
          	cout << cnt;
          	return 0;
          }
          
          • -2
            @ 2024-1-5 13:16:14
            #include<cstdio>
            using namespace std;
            bool a[200][200];
            void kill(int,int);
            int main(){
            	int n,m;
            	scanf("%d %d",&n,&m);
            	for(int i=1;i<=n;i++)
            	for(int j=1;j<=m;j++)
            	scanf("%1d",&a[i][j]);
            	int sum=0;
            	for(int i=1;i<=n;i++)
            	for(int j=1;j<=m;j++)
            	if(a[i][j]){
            		sum++;
            		kill(i,j);
            	}
            	printf("%d",sum); 
            }
            void kill(int n,int m){
            	a[n][m]=0;
            	if(a[n+1][m])
            	kill(n+1,m);
            	if(a[n-1][m])
            	kill(n-1,m);
            	if(a[n][m+1])
            	kill(n,m+1);
            	if(a[n][m-1])
            	kill(n,m-1);
            }
            
          • 1

          Information

          ID
          972
          Time
          1000ms
          Memory
          125MiB
          Difficulty
          5
          Tags
          # Submissions
          55
          Accepted
          22
          Uploaded By