深度优先搜索—最大油田问题

  • 问题描述:政府现勘探到一片油田,有散落的石油资源。因为经费原因,只能开采一处油田,所以需找到最大的油田。
  • 问题思路:政府现勘探到一片油田,有散落的石油资源。因为经费原因,只能开采一处油田,所以需找到最大的油田。
  • 算法实现:用邻接矩阵表示油田分布图,0为陆地,1为油田
int grid[M][N] = {
    { 0, 0, 0, 0, 1, 1 },
    { 0, 1, 1, 0, 1, 1 },
    { 0, 1, 1, 0, 0, 0 },
    { 0, 1, 0, 0, 1, 0 },
    { 0, 0, 0, 1, 1, 0 }
};
  • 测试用例
#include <stdio.h>
#define M 5
#define N 6

//油田分布图,1表示有油田
int grid[M][N] = {
    { 0, 0, 0, 0, 1, 1 },
    { 0, 1, 1, 0, 1, 1 },
    { 0, 1, 1, 0, 0, 0 },
    { 0, 1, 0, 0, 1, 0 },
    { 0, 0, 0, 1, 1, 0 }
};

int visited[M][N] = { 0 };

//油田状况
int DFS(int x, int y) {
    printf("%d,%d ", x, y);
    if (x >= 0 && x < M && y >= 0 && y < N  //在界内
        && visited[x][y] == 0		//且未访问
        && grid[x][y] == 1)		//且有油田
    {
        visited[x][y] = 1;		//找到一块油田
        printf("ya\n");
        return 1 + DFS(x, y + 1)	//东侧 搜索
                 + DFS(x + 1, y)	//南侧 搜索
                 + DFS(x, y - 1)	//西侧 搜索
                 + DFS(x - 1, y);	//北侧 搜索
    } else
        return 0;
}

int main() {
    int ans = 0, i, j, area;
    //指挥所
    for (i = 0; i < M; i++)
        for (j = 0; j < N; j++) {
            //如果无油田,或已搜索,跳过
            if (grid[i][j] == 0 || visited[i][j] == 1)
                continue;
            //在(i,j)处发起一次搜索,area为已搜到的油田面积
            area = DFS(i, j);
            printf("\n(%d,%d): %d\n", i, j, area);
            if (ans < area)
                ans = area;
        }

    printf("max oil field: %d\n", ans);
}

  • 运行结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值