UVA-572(Oil Deposits)

UVA-572(Oil Deposits)

题目:
https://cn.vjudge.net/problem/UVA-572

代码如下:

#include<bits/stdc++.h>
using namespace std;

char str[105][105];
bool vis[105][105];
int m,n,direction[8][2] = {{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};

void dfs(int i,int j)
{
    int dx,dy;
    for(int k = 0;k < 8;k++)//八种不同的方向
    {
        dx = i + direction[k][0];
        dy = j + direction[k][1];
        //考虑搜寻到的点是否为@,还考虑此点是否越界以及是否是新点
        if(str[dx][dy] == '@' && vis[dx][dy] && dx >= 0 && dx < m && dy >= 0 && dy < n)
        {
            vis[dx][dy] = false;
            dfs(dx,dy);
        }
    }
}

int main()
{
    int ans;
    while(scanf("%d%d",&m,&n) && m && n)
    {
        ans = 0;//每次输入前需要将连通分量的个数初始化为0
        for(int i = 0;i < m;i++)
        {
            scanf("%s",&str[i]);
            for(int j = 0;j < n;j++) vis[i][j] = true; //初始化所有点为新点
        }
        for(int i = 0;i < m;i++)
        {
            for(int j = 0;j < n;j++)
            {
                if(str[i][j] == '@' && vis[i][j])//确保搜索的点是@并且是新点
                {
                    ans++;//连通分量数量累加
                    dfs(i,j);
                }
            }
        }
        cout << ans << endl;
    }
    return 0;
}

下来简单介绍一下深度优先搜索
深度优先搜索(Depth-First-Search):
从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不了就回退,此种路径搜索策略就称为“深度优先搜索”,简称“深搜”。

其实称为“远度优先搜索”更容易理解些。因为这种策略能往前走一步就往前走一 步,总是试图走得更远。所谓远近(或深度),就是以距离起点的步数来衡量的。

题目思路:
这道题的题意简单来说就是输入m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所 在的格子相邻(横,竖或者对角线方向),就说它们属于同一个八连块。

其实这道题就是要求图中联通分量的个数。首先定义一个二维数组来保存输入的m行n列字符,然后定义一个bool型的二维数组,并且把这些点都初始化为true(true代表的就是新点)。随后就可以来搜索字符为‘@’的新点。找到之后八连块个数加1,随行进行dfs操作。进行dfs操作时把传入的点作为起点,起点往四处走一共有8种不同走法(横,竖或者对角线方向)。所以使用for循环分别尝试这8种不同的走法,如果走到的点是‘@’的新点那么就进行递归再次执行dfs操作,并且把这个点改为false(也就是把这个点设置为旧点)。直到发现起点的周围再无字符为‘@’的新点,然后返回main函数寻找下一个字符为‘@’的新点,每次次数加一。最后就能求出八连块的个数。

猜你喜欢

转载自blog.csdn.net/qq_41998938/article/details/84197659
今日推荐