经典搜索题 油田dfs

题目描述:

GeoSurvComp地质探测公司负责探测地下油田。每次GeoSurvComp公司都是在一块长方形的土地上来探测油田。在探测时,他们把这块土地用网格分成若干个小块,然后逐个分析每块土地,用探测设备探测地下是否有油田。土地底下有油田则成为pocket,如果两个pocket相邻,则认为是同一块油田,油田可能覆盖多个pocket。试计算长方形的土地上有多少个不同的油田。

输入描述:

输入文件中包含多个测试数据,每个测试数据描述了一个网格。每个网格数据的第1行为两个整数:m、n,分别表示网格的行和列;如果m=0,则表示输入结束,否则1<=m<=100,1<=n<=100。接下来有m行数据,每行数据有n个字符(不包括行结束符)。每个字符代表一个小方块,如果为“*”,则代表没有石油,如果为“@”,则代表有石油,是一个pocket。

输出描述:

对输入文件中的每个网格,输出网格中不同的油田数目。如果两块不同的pocket在水平、垂直或者对角线方向上相邻,则被认为属于同一块油田。每块油田所包含的pocket数目不会超过100。

样例输入输出:

在这里插入图片描述

思路:从行列对角线方向为同一个油田可以得知设定方向数组

int next[8][2]={{-1,-1},
				{0,-1},
				{1,-1},
				{-1,0},
				{1,0},
				{-1,1},
				{0,1},
				{1,1}};

分别代表八个走向。
整体思路为:遍历每一个坐标点,如果是@则进行搜索,搜索直到非油田也就是 * 结束,ans++;搜索到的标记为 非油田 “*”
挨个点进行遍历

参考别的大佬后修改的ac代码

#include<stdio.h>
char a[150][150];
int m,n;
int tx,ty;//下一个的坐标点 
int next[8][2]={{-1,-1},{0,-1},{1,-1},{-1,0},{1,0},{-1,1},{0,1},{1,1}};//八方向数组 
void dfs(int x,int y){
	a[x][y] = '*';//遍历过后标记成 * 
	for(int k=0;k<8;k++){
		tx = x+next[k][0];
		ty = y+next[k][1];
		if(tx<0 || ty<0 || tx>=m || ty>=n)
		continue;//判断越界,越界了就继续换个方向走 
		if(a[tx][ty]=='@')
		dfs(tx,ty);//如果是油田继续给爷搜 
	
	}
}
int main(){
	while(1){
		scanf("%d %d",&m,&n);
		if(m==0) break; //结束 
		for(int i = 0;i<m;i++){
			scanf("%s",a[i]);//原来还可以这么输入 
		}
		int ans=0;
		for(int i=0;i<m;i++){
			for(int j=0;j<n;j++){
				if(a[i][j] == '@'){//(起始搜索点)如果是油田的话开始搜 
					dfs(i,j);
					ans++;
				}
				
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是BFS和DFS算法的C++模板: BFS算法模板: ```cpp #include <iostream> #include <queue> using namespace std; void BFS(int start, int end) { queue<int> q; bool visited[n]; // 标记节点是否被访问过 int level[n]; // 记录节点的层级 // 初始化visited和level数组 for (int i = 0; i < n; i++) { visited[i = false; level[i = 0; } q.push(start); visited[start = true; while (!q.empty()) { int current = q.front(); q.pop(); // 进行当前节点的操作 for (int neighbor : 获取当前节点的所有邻居节点) { if (!visited = true; level = level[current + 1; } } } // 输出结果,例如输出最短路径的长度 cout << "最短路径长度为:" << level[end << endl; } ``` DFS算法模板: ```cpp #include <iostream> using namespace std; void DFS(int current, bool visited[]) { // 进行当前节点的操作 visited[current = true; // 标记当前节点已访问 for (int neighbor : 获取当前节点的所有邻居节点) { if (!visited = false; } DFS(start, visited); return 0; } ``` 这些模板可以用于解决各种问,如迷宫、八皇后、n皇后、油田、连通块、数独等。在使用时,根据具体问的要求选择适合的算法,并按照注释部分进行相应的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [DFS和BFS理解+模板+例](https://blog.csdn.net/weixin_43876357/article/details/112552683)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值