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