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

  • 问题描述:政府现勘探到一片油田,有散落的石油资源。因为经费原因,只能开采一处油田,所以需找到最大的油田。
  • 问题思路:政府现勘探到一片油田,有散落的石油资源。因为经费原因,只能开采一处油田,所以需找到最大的油田。
  • 算法实现:用邻接矩阵表示油田分布图,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);
}

  • 运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HelloWorld_4396/article/details/131226929