DFS——The Mine

The Mine  

The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. It then analyzes each plot separately, using sensing equipment to determine whether or not the plot contains oil.

A plot containing oil is called a pocket. If two pockets are adjacent, then they are part of the same oil deposit. Oil deposits can be quite large and may contain numerous pockets. Your job is to determine how many different oil deposits are contained in a grid.

 

Input 

The input file contains one or more grids. Each grid begins with a line containing m and n, the number of rows and columns in the grid, separated by a single space. If m = 0 it signals the end of the input; otherwise $1 \le m \le 100$ and $1 \le n \le 100$. Following this are m lines of n characters each (not counting the end-of-line characters). Each character corresponds to one plot, and is either ` *', representing the absence of oil, or ` @', representing an oil pocket.

 

Output 

For each grid, output the number of distinct oil deposits. Two different pockets are part of the same oil deposit if they are adjacent horizontally, vertically, or diagonally. An oil deposit will not contain more than 100 pockets.

 

Sample Input 

1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0

 

Sample Output 

0
1
2
2

 

简单的DFS搜索,在搜索的过程中,注意修改遍历过的值以避免重复遍历

 

#include <stdio.h>

char dui[100][100];
char mapp[100][100];
int n,m;
int fx[] = {-1,-1,-1,0,0,1,1,1};
int fy[] = {-1,0,1,-1,1,-1,0,1};
int dfs(int i,int j)
{
    int x;
    if(i >= 0 && i < m && j >= 0 && j < n)
    {
        if(mapp[i][j] == '@')
        {
            mapp[i][j] = '*';
            for(x = 0;x < 8;x++)
            {
                dfs(i + fx[x],j + fy[x]);
            }
        }
    }
    return 0;
}
int main()
{
    int i,j,k;
    while(scanf("%d%*c%d%*c",&m,&n),m)
    {
        k = 0;
        for(i = 0; i<m; i++)
        {
            scanf("%s",&mapp[i]);
        }
        for(i = 0; i<m; i++)
        {
            for(j = 0; j<n; j++)
            {
                if(mapp[i][j] == '@')
                    {
                        k++;
                        dfs(i,j);
                    }
            }
        }
        printf("%d\n",k);
    }
    return 0;
}



Miguel A. Revilla
1998-03-10
DFS(深度优先搜索)可以用于解决迷宫出口问题。 首先,我们需要将迷宫转化为图,其中每个房间是图中的一个节点,每个房间之间的通道是图中的一条边。我们可以用一个二维数组来表示迷宫,其中0表示墙,1表示通道。 然后,我们可以使用DFS来搜索迷宫。我们从起点开始探索,每次选择一个未被访问的相邻节点进行探索,直到找到出口为止。为了避免陷入死循环,我们需要记录已经访问过的节点。 具体实现可以使用递归或者栈来实现DFS,以下是一个使用递归的示例代码(假设起点为(0,0),出口为(n-1,m-1)): ```python def dfs(x, y, visited, maze): # 判断当前节点是否为出口 if x == len(maze)-1 and y == len(maze[0])-1: return True # 标记当前节点已被访问 visited[x][y] = True # 搜索相邻节点 for dx, dy in [(0,1), (0,-1), (1,0), (-1,0)]: nx, ny = x+dx, y+dy # 判断相邻节点是否合法 if 0 <= nx < len(maze) and 0 <= ny < len(maze[0]) and maze[nx][ny] == 1 and not visited[nx][ny]: # 递归搜索相邻节点 if dfs(nx, ny, visited, maze): return True return False # 测试 maze = [ [1, 0, 1, 1, 1], [1, 0, 1, 0, 1], [1, 0, 1, 0, 1], [1, 1, 1, 0, 1], [0, 0, 0, 0, 1] ] visited = [[False for _ in range(len(maze[0]))] for _ in range(len(maze))] print(dfs(0, 0, visited, maze)) # 输出True,表示存在从起点到出口的路径 ``` 这段代码中,dfs函数的参数分别表示当前搜索的节点坐标、已经访问过的节点、迷宫的二维数组。搜索过程中,我们先判断当前节点是否为出口,如果是,则返回True。然后标记当前节点已被访问,并搜索相邻节点,如果找到了一个相邻节点可以到达出口,则返回True。否则,返回False表示无法到达出口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值