zoukankan      html  css  js  c++  java
  • luogu1451 求细胞数量

    这道题有挺多注意的点的,主要是新手还是要学习一个‘

    这是每次新开始的循环,第几次找,答案ans就是几,if语句满足判断才进行下一步

        for(int i=0;i<m;i++)//m=4
            for(int j=0;j<n;j++)//n=10
            {
                if(a[i][j])
                {
                    ans++;
                    dfs(i,j);
                }
            }

    dfs,有三个关键之处

    void dfs(int x,int y)
    {
        if(x<0||y<0||x>m||y>n) return;
        a[x][y]=0;
        for(int i=0;i<4;i++)
        {
            if (a[x+dx[i]][y+dy[i]])
                dfs(x+dx[i],y+dy[i]);//如果有才搜
        }
     } 

    1.

    递归转移

            if (a[x+dx[i]][y+dy[i]])
                dfs(x+dx[i],y+dy[i]);//如果有才搜

    要注意,在这一步,由于有4种(多种)可能,所以不能够改变x,y原有的数值

    不能写成

            x=+dx[i];
            y=+dy[i];
            if (a[x][y])
                dfs(x,y);

    这样比如,i=0的时候是一样的,

    可是如果再下一次,即i=1的时候,则是在i=0改变后的x,y再改变,

    而不是从原有的x,y转移而来

    2,

    在界内再搜索,只要满足界内就可以

    if(x<0||y<0||x>m||y>n) return;

    3.

    改变点的状态

    要把这个点清零

            a[x][y]=0;    

    其实在实际操作是213的顺序,可以说是途径型的典型

    在输入时有使用的技巧,确保每次输入一个

        scanf("%1d",&a[i][j]);    
    #include<bits/stdc++.h>
    using namespace std;
    
    int dx[4]={0,1,-1,0};
    int dy[4]={1,0,0,-1};
    int n,m;
    int ans;
    int a[110][110];
    
    void dfs(int x,int y)
    {
        if(x<0||y<0||x>m||y>n) return;
        a[x][y]=0;
        for(int i=0;i<4;i++)
        {
            if (a[x+dx[i]][y+dy[i]])
                dfs(x+dx[i],y+dy[i]);//如果有才搜
        }
     } 
    
    int main()
    {
        cin>>m>>n;
        for(int i=0;i<m;i++)//m=4
            for(int j=0;j<n;j++)//n=10
                {
                    scanf("%1d",&a[i][j]);
                }
        for(int i=0;i<m;i++)//m=4
            for(int j=0;j<n;j++)//n=10
            {
                if(a[i][j])
                {
                    ans++;
                    dfs(i,j);
                }
            }
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    洛谷 3393 逃离僵尸岛
    洛谷 3275 [SCOI2011]糖果
    SP1437 Longest path in a tree(树的直径)
    洛谷2483 k短路([SDOI2010]魔法猪学院)
    洛谷3243 [HNOI2015]菜肴制作
    洛谷 4568 [JLOI2011] 飞行路线
    [USACO08DEC]在农场万圣节Trick or Treat on the Farm
    手机端table表格bug
    手机端左右滑动效果
    去掉手机端延迟300ms
  • 原文地址:https://www.cnblogs.com/cyfe67373/p/12444768.html
Copyright © 2011-2022 走看看