zoukankan      html  css  js  c++  java
  • 数细胞-swust oj

    数细胞(0964)

    一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。编程需要用到的队列及其相关函数已经实现,你只需要完成count函数以及主函数即可。 

    第一行输入两个整数,分别代表矩阵的行和列 输入m*n的矩阵,由数字0到9组成。

    4 10
    1 2 3 4 5 1 1 1 6 7
    1 0 3 4 5 6 1 5 1 0
    2 0 4 5 6 6 1 6 7 1
    0 0 6 0 6 6 1 0 8 9

    细胞个数。

    1
    代码:
    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    int m, n;
    int go[4][2] = { { -1, 0 }, { 1, 0 }, { 0, 1 }, { 0, -1 } };//定义方向数组:上下左右
    int map[105][105];
    void dfs(int x, int y)//遍历
    {
        map[x][y] = 0;//之前把这里写成了map[x][y]='0';真是傻了,调了半天才调出来
        for (int i = 1; i <= 4; i++)//上下左右
        {//之前把这里写成了八个方向,所以怎么交都不对
        
                int gx = x + go[i-1][0];//左右
                int gy = y + go[i-1][1];//上下
                if (gx >= 0 && gx < m&&gy >= 0 && gy < n&&map[gx][gy] != 0)//在范围内,并且当前为细胞
                {
                    dfs(gx, gy);//遍历某个区域
                }
        }
    }
    int main()
    {
    
        int i, j, k=0;
        cin >> m >> n;
        {
            for (i = 0; i < m; i++)
            {
                for (j = 0; j < n; j++)
                {
                    cin >> map[i][j];//输入地图
                }
            }
            for (i = 0; i < m; i++)
            {
                for (j = 0; j < n; j++)
                    if (map[i][j] != 0)//初始
                    {
                        k++;
                        dfs(i, j);//遍历
                    }
            }
            cout << k ;
        }
        return 0;
    }

    这是第二种不同的写法,稍微麻烦了点:

    #include<iostream>
    using namespace std;
    #define max 100
    int m, n, str[max][max];
    void Input()
    {
        int i, j;
        cin >> m >> n;
        for (i = 0; i<m; i++)
        {
            for (j = 0; j<n; j++)
            {
                cin >> str[i][j];
            }
        }
    }
    bool exist(int x, int y)
    {
        if (x >= 0 && x<m&&y >= 0 && y<n)
            return true;
        else
            return false;
    }
    
    void DFS(int x, int y)
    {
        int tx, ty, i;
        str[x][y] = 0;
        for (i = 0; i<4; i++)
        {
            if (i == 0)
            {
                tx = x - 1;
                ty = y;
                if (exist(tx, ty))
                {
                    if (str[tx][ty] != 0)
                    {
                        DFS(tx, ty);
                    }
                }
            }
            else
            if (i == 1)
            {
                tx = x + 1;
                ty = y;
                if (exist(tx, ty))
                {
                    if (str[tx][ty] != 0)
                    {
                        DFS(tx, ty);
                    }
                }
            }
            else
            if (i == 2)
            {
                tx = x;
                ty = y + 1;
                if (exist(tx, ty))
                {
                    if (str[tx][ty] != 0)
                    {
                        DFS(tx, ty);
                    }
                }
            }
            else
            if (i == 3)
            {
                tx = x;
                ty = y - 1;
                if (exist(tx, ty))
                {
                    if (str[tx][ty] != 0)
                    {
                        DFS(tx, ty);
                    }
                }
            }
        }
    }
    int main()
    {
        int i, j, count = 0;
        Input();
        for (i = 0; i<m; i++)
        {
            for (j = 0; j<n; j++)
            {
                if (str[i][j] != 0)
                {
                    count++;
                    DFS(i, j);
                }
            }
        }
        cout << count;
        return 0;
    }

     DFS

    #include<iostream>
    using namespace std;
    const int maxnum = 80 + 5;
    int map[maxnum][maxnum];
    int visit[maxnum][maxnum];//判断是否访问过
    int dis[4][2] = { { -1, 0 }, { 1, 0 }, { 0, 1 }, { 0, -1 } };//方向数组
    int M, N;
    void DFS(int x,int y)
    {
        int i;
        int dx, dy;
        for (i = 0; i < 4; i++)
        {
            dx = x + dis[i][0];
            dy = y + dis[i][1];
            if (dx < M&&dx >= 0 && dy < N&&dy >= 0 && visit[dx][dy]==0 )//判断是否越界  并且没访问过
            {
                visit[dx][dy] = 1;//节点已经访问
                DFS(dx,dy);//继续遍历
            }
        }
    
    
    }
    int main()
    {
        int i,j;
        int cnt = 0;
        memset(map, 0, sizeof(map));
        memset(visit, 0, sizeof(visit));
        cin >> M >> N;
        for (i = 0; i < M;i++)
        for (j = 0; j < N; j++)
        {
            cin >> map[i][j];
        }
        for (i = 0; i < M; i++)
        {
            for (j = 0; j < N; j++)
            {
                if (map[i][j]!=0&& (visit[i][j]==0))
                {
                    visit[i][j] = 1;
                    DFS(i, j);
                    cnt++;
                }
            }
        }
        cout << cnt << endl;
        
        return 0;
    }
    以大多数人努力程度之低,根本轮不到去拼天赋~
  • 相关阅读:
    很长的下拉框菜单
    Pure CSS Buttons – Good Button Style and No Images
    ssh 配置
    php大量session存储到内存中,散列及过期回收
    array_append_distinct, array_erase函数
    关于C# 中的Attribute 特性(转载)
    Jquery如何操作Table的某一个td
    ASP.NET应用程序生命周期趣谈(四) HttpHandler和页面生命周期
    ASP.NET应用程序生命周期趣谈(五) IIS7瞎说
    ASP.NET应用程序生命周期趣谈(三)
  • 原文地址:https://www.cnblogs.com/gcter/p/7467307.html
Copyright © 2011-2022 走看看