HDU1241 Oil Deposits(油田) 深搜dfs

HDU1241:Oil Deposits
深度优先搜索dfs:

题意:"@“代表石油井,”*"代表没油,如果@在八个方向有相邻,则认为同属于一个油田,输入n行m列的图,问有多少块油田?输入以0 0结束

题目和 (POJ)-2386-Lake Counting (湖计数)一样属于求连通块

代码:

import java.util.Scanner;

public class Main {
	static int N, M;// 地图长宽
	static String[] s;//地图
	static int[][] vis;//用来染色
	static int count;
// static int dir[][] = { {0,1},{0,-1},{1,0},{-1,0},{-1,-1},{1,-1},{-1,1},{1,1} };// 方向

	 static void dfs(int i, int j) {
		if (i < 0 || j < 0 || i >= N  || j >= M ||vis[i][j]==1)
			return;// 越界
		else if (s[i].charAt(j) == '*')
			return;// 障碍物
		else {
			vis[i][j]= 1;// 染色
			dfs(i - 1, j);
			dfs(i - 1, j + 1);
			dfs(i - 1, j - 1);
			dfs(i + 1, j);
			dfs(i + 1, j + 1);
			dfs(i + 1, j - 1);
			dfs(i, j + 1);
			dfs(i, j - 1);
// for(int k=0;i<8;k++){
// dfs(i+dir[k][0],j+dir[k][1]);
// }
		}
		return;
	}

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		while (in.hasNext()) {

			N = in.nextInt();
			M = in.nextInt();
			s =new String[N];//行
			vis =new int [N][M];
			count=0;
			if (N == 0 && M == 0)	break;
			for (int i = 0; i < N; i++) {
				s[i] = in.next();
			}
// Arrays.fill(vis, 0);
			for(int i=0;i<N;i++)
			{
				for(int j=0;j<M;j++)
				{
					if(s[i].charAt(j) == '@' && vis[i][j]==0){
						count++;
						dfs(i,j);
					}
				}
			}		
			System.out.println(count);
		}
	}
}

C++版:

#include<iostream>

using namespace std;

int N,M;//mapp长宽 

char mapp[105][105];

int nextt[8][2]={//方向 
					{ 0, 1}
,					{ 1, 1}
,					{ 1, 0}
,					{ 1,-1}
,					{ 0,-1}
,					{-1,-1}
,					{-1, 0}
,					{-1, 1}
,								};

void dfs(int x,int y)
{

	 for(int i=0;i<8;i++)
	 {
	 	int gx=x+nextt[i][0];
		int gy=y+nextt[i][1];	
	 	if(gx>=0 && gx<N && gy>=0 && gy<M && mapp[gx][gy]=='@' )
	 	{
	 		mapp[gx][gy]='*';
	 		dfs(gx,gy);
	 	}
	 }
}
 
int main()
{
	while(~scanf("%d%d",&N,&M) && N||M)
	{	
	    int count=0;
		for(int i=0;i<N;i++)
		{//输入数组mapp 
			for(int j=0;j<M;j++)
			{
				cin>>mapp[i][j];
			}
		}
		
	    for(int i=0;i<N;i++)
	    {
	    	for(int j=0;j<M;j++)
	    	{
	    		if(mapp[i][j]=='@')
	    		{
	    			count++;
	    			dfs(i,j);
	    		}
	    	}
	    }
	    cout<<count<<endl;
	}
	return 0;
}

全部评论

相关推荐

搜索部&nbsp;首先说下timeline8.18,投递8.19,约一面8.21,晚上一面call约二面8.22,上午二面下午oc周末等待(8.23,8.24)8.25,offer一年前,我还是懵懵懂懂,高考完的暑假,只会提前学学高数,未来的画像是什么?我或许无法预测。开学后,自学Python,接单,无数个客户的ddl,偷偷摸摸一个人找自习的地方,这一步步竟然为后来的我,搭建工程能力的基础。大一上,我也要感谢我的第一位老板,让我接触到了实习,师兄带着我一步步入门,看他们写的飞书文档。大一下,导师带我参与企业项目,这让我渐渐发现,应该去实践,增长见识,而非局限当下,盯着自己的小新pro。不久后,第一波投递开始,结果当然是约面极少。盯着简历上的文字和ssob,我开始思考,确实很多可以去提升。带着些许不甘心,继续沉淀,慢慢的约面也越来越多,有的时候两天7场,准备完就接着下一个日程。这一次,也许是刚好到位吧,比较match,面试答的流利,关关难关关过,成为度孝子展望未来,依然是重重挑战,果然只有收到offer的那一刻是开心的。愿在百度星海拆解的每一段代码,都能成为丈量宇宙的诗行;此志终赴星河,而今迈步重铸天阶。屏幕前的你们,在无数个向星海奔赴的日夜,一定一定,会在未来化作群星回响的征程——请永远相信此刻埋首耕耘的自己!!!
一天三顿半:???百度提前批发 offer了?不是统一和正式批排序完再发吗我靠
百度求职进展汇总
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务