• P1451 求细胞数量


    P1451 求细胞数量

    解读一下题目(结合样例)

    其实所有非零数字性质都是一样的,方便起见把他们都处理为1

    因此这个阵中只有0,1两个数字

    此时我们把0数字虚化(再摘下眼镜)

    您会发现有4个细胞(4个小聚落)

    一定要注意这个样例!!!

    一定要注意这个样例!!!

    一定要注意这个样例!!!

     

    他在输入细胞的时候,是把他当做一个字符串输入的(泥看每个数字之间没有空格鸭)

    在你输入行,列数目以后,打个空格,免得和以后的“细胞”混淆

           代码处理:

    我的代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<cstdlib>
    using namespace std;
    int n,m;
    int bz[1000][1000],num=0;
    int dx[4]={-1,0,1,0},    // 上下左右寻找
        dy[4]={0,-1,0,1};
        
    void doit(int p,int q)
    {
        num++;bz[p][q]=0;    //用后清零,防止多次计数
        int x,y,t,w;
        int h[1000][2];
        h[1][1]=p;h[1][2]=q;
        t=0;w=1;
        do
        {
            t++;
            for(int i=0;i<=3;i++)
            {
                x=h[t][1]+dx[i];
                y=h[t][2]+dy[i];
                if(x>=0&&x<n&&y>=0&&y<m&&bz[x][y])  //防止出界
                {
                    w++;    //入队
                    h[w][1]=x;
                    h[w][2]=y;
                    bz[x][y]=0;   //用后清零,防止多次计数
                }
                
            }
        }while(t<w);   //t=w时,队列为空
        
    }
    int main()
    {
        
        scanf("%d%d
    ",&n,&m);
    for(int i=0;i<n;i++)
          for(int j=0;j<m;j++)
          bz[i][j]=1;          //先把他都当做1,出现了0再处理为0
        char s[1000];
        for(int i=0;i<n;i++)
        {
            gets(s);
           for(int j=0;j<m;j++)
    if(s[j]=='0')
     bz[i][j]=0;
        }
        
        for(int i=0;i<n;i++)
          for(int j=0;j<m;j++)
          if(bz[i][j])
          doit(i,j);
        
        printf("%d",num);
        return 0;
        
    }

    柏树:(泥就当我没有写上下面这些代码吧)

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<algorithm>
    #include<string>
    #include<cstring>
    using namespace std;
    int bz[1000][1000],num=0,n,m;
    int dx[4]={-1,0,1,0},
        dy[4]={0,1,0,-1};
    void doit(int p,int q)
    {
        int x,y,t,w,i;
        int h[1000][2];
        num++;
        bz[p][q]=0;
        t=0;w=1;h[1][1]=p;h[1][2]=q;
        do
        {
            t++;
            for(i=0;i<=3;i++)
            {
                x=h[t][1]+dx[i];
                y=h[t][2]+dy[i];
                if(x>=0&&x<m&&y>=0&&y<n&&bz[x][y])
                {
                    w++;
                    h[w][1]=x;
                    h[w][2]=y;
                    bz[x][y]=0;
                    
                }
            }
        }while(t<w);
    }
    int main()
    {
        int i,j;
        char s[100],ch;
        scanf("%d%d
    ",&m,&n);
        for(i=0;i<=m-1;i++)
          for(j=0;j<=n-1;j++)
          bz[i][j]=1;
          
        for(i=0;i<=m;i++)
        {
            gets(s);
            for(j=0;j<=n-1;j++)
              if(s[j]=='0')
              bz[i][j]=0;
        }
        
        for(i=0;i<=m-1;i++)
          for(j=0;j<=n-1;j++)
          if(bz[i][j])
          doit(i,j);
        cout<<num;
        
        
        return 0;
    }

    柏树原题(广搜)

    柏树类原题(队列)

    其实他们的本质啊。。。和人类的本质是一样的

  • 相关阅读:
    转载--重写、覆盖、重载、多态几个概念的区别分析
    笔试题--奇虎360-2013
    转载---数据挖掘十大经典算法
    Nginx的启动、停止与重启
    程序员的十种级别,看看你属于哪一种?
    C标签的用法
    eclipse修改代码后都需要clean的解决办法
    创建一个jFinal项目
    java redirect用法
    java获取访问者真实的IP地址
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/10692724.html
Copyright © 2020-2023  润新知