石油合并(DFS入门必看)

油田合并
TimeLimit: 1 Second MemoryLimit: 32 Megabyte
Totalsubmit: 597 Accepted: 164
Description

某石油公司发现了一个油田。该油田由n*m个单元组成的矩形,有些单元里有石油,有些则没有。单元油田可以通过上,下,左或右连通。在一个单元油田里架设一台采油机,它可以把和该单元油田相连的单元油田的石油采完。该公司想知道最少需要架设几台采油机能把所有的石油采完?

Input

先输入2个正整数n,m(1<=n,m<=50)。接着有n行,每行有m个字符。’@’表示该单元有石油,’*’则表示该单元没有石油。
输入到文件结束。
Output

对于每组测试,输出最少需要架设几台采油机。
Sample Input

2 2
@*
*@
2 2
@@
@@
Sample Output

2
1

#include <cstdio>
#include <cstring>
#define lim 55
char Map[lim][lim];
int Vis[lim][lim];
char str[lim];
void dfs(char Map[][lim], int Vis[][lim], int x, int y);
int main()
{
    int row, col;
    int cnt=0;
    while(scanf("%d%d", &row, &col)!=EOF)
    {
        cnt=0;
        memset(Map, '*', sizeof(Map));
        memset(Vis, 0, sizeof(Vis));
        memset(str, 0, sizeof(str));

        for(int i=1; i<=row; i++)
        {
            scanf("%s", str);
            for(int j=1; j<=col; j++)
                Map[i][j]=str[j-1];
        }

        for(int i=1; i<=row; i++)
        {
            for(int j=1; j<=col; j++)
            {
                if(Map[i][j]=='@'&&Vis[i][j]==0)
                {
                    dfs(Map, Vis, j, i);
                    cnt++;
                }
            }
        }
        printf("%d\n",cnt);
    }
    return 0;
}

void dfs(char Map[][lim], int Vis[][lim], int x, int y)
{
    if(Map[y][x]=='*'||Vis[y][x]==1)
        return;
    Vis[y][x]=1;
    dfs(Map, Vis, x-1, y);
    dfs(Map, Vis, x+1, y);
    dfs(Map, Vis, x, y-1);
    dfs(Map, Vis, x, y+1);
}

比八连块更简单的dfs,完全就是一样,拿来练练手,不过要注意Map数组的初始化。我一开始就没有注意到,按照八连块的写法然后出错,找了好久的原因,我竟然把Map数组初始化为0,应该初始化为‘*’。总之虽然很简单,但是要是一次敲对还是有难度的,拿来练练手。

你可能感兴趣的:(入门,DFS)