深さ優先探索 - 最大の油田問題

  • 問題の説明: 政府は現在、石油資源が散在する油田を探索しています。経済的理由により、開発できる油田は 1 つだけであるため、最大の油田を見つける必要があります。
  • 問題の考え方: 政府は現在、石油資源が点在する油田を探索しています。経済的理由により、開発できる油田は 1 つだけであるため、最大の油田を見つける必要があります。
  • アルゴリズムの実装: 隣接行列を使用して油田分布図を表現します。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