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;
}