dfs算法经典例题

这是一篇关于使用深度优先搜索(DFS)解决Oil Deposits问题的博客。内容涉及如何通过DFS算法来寻找并标记潜在的石油储藏区域。

Oil Deposits

#include<stdio.h>

#include<string.h>
int m,n,sum;
char map[102][102];
int dir[8][2]= {0,1,0,-1,1,0,-1,0,-1,-1,1,1,-1,1,1,-1};
void dfs(int i,int j)
{
    for(int s=0; s<8; s++)
    {
        int di=i+dir[s][0];
        int dj=j+dir[s][1];
        if(di<0||dj<0||di>=m||dj>=n||map[di][dj]=='*')
            continue;
        map[di][dj]='*';
        dfs(di,dj);
    }
}
int main()
{
    while(~scanf("%d%d",&m,&n))
    {
        sum=0;
        for(int i=0; i<m; i++)
               scanf("%s",map[i]);
        for(int i=0; i<m; i++)
            for(int j=0; j<n; j++)
                if(map[i][j]=='@')
                {
                    map[i][j]='*';
                    dfs(i,j);
                    sum++;
                }
        printf("%d\n",sum);
    }
    return 0;
}
深度优先搜索(DFS)有许多经典例题,以下是一些具体介绍: - **全排列问题**:该问题可使用DFS算法解决。DFS算法是一种搜索算法,本质上是一种枚举,借助计算机高性能有目的地枚举问题的部分或所有情况来求解 [^1]。 - **走迷宫问题**:这是非常经典DFS问题。通常会给定迷宫的行数和列数,用特定符号表示墙壁(如 *)、路(如 .)、开始标记(如 S)和结束标记(如 T),通过DFS算法找到从起点到终点的路径 [^3]。 - **判断岛屿数量问题**:给定一个由字符组成的二维数组,其中 '1' 表示陆地,'0' 表示水,通过DFS算法可以计算出岛屿的数量。代码示如下: ```c //注意里面的数字是字符。 int rowpath[] = {-1, 0, 1, 0}; int colpath[] = {0, -1, 0, 1}; void dfs(char** grid, int gridRowLen, int* gridColLen, int row, int col) { if(row<0||col<0||row==gridRowLen||col==*gridColLen||grid[row][col]=='0')return ; grid[row][col] = '0'; for (int i = 0; i < 4; i++) { dfs(grid, gridRowLen, gridColLen, row + rowpath[i], col + colpath[i]); } } int solve(char** grid, int gridRowLen, int* gridColLen) { // write code here int count = 0; for (int i = 0; i < gridRowLen; i++) { for (int j = 0; j < *gridColLen; j++) { if (grid[i][j] == '1') { dfs(grid, gridRowLen, gridColLen, i, j); count++; } } } return count; } ``` 上述代码通过递归调用 `dfs` 函数将相连的陆地 '1' 标记为 '0',从而统计出岛屿的数量 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值