您的位置:首页 > 编程语言 > Java开发

hdu1241 求联通快(java)

2017-09-02 22:36 746 查看
GeoSurvComp地质调查公司负责探测地下石油储量。GeoSurvComp公司在一段时间内在一大块矩形区域内工作,创造出一个网格把土地分成很多方块。如果每一方块单独分析,使用感应设备去测定方块中是否含有石油。含有油的方块称为口袋。如果两个口袋是相邻的,那它们属于同一个油床。油床可以相当大,可以包含众多口袋。你的任务就是测定出有多少不同的油床。

输入:

输入文件包括一个或多个网格。每一个网格输入的第一行含有m和n,分别代表网格的横坐标和纵坐标,被一个空格分开。如果m=0则标志着输入结束;否则1<=m<=100并且1<=n<=100。接下来输入m行n列个网格特征(不记录换行符)。每一个特征值跟一个方块相对应,并且要么是*(代表没油),要么是@代表一个石油口袋。

输出:

对于每一个方块,输出不同的油田数。两个不同的口袋属于同一个油田,如果它们垂直水平或对角相邻。一个油田包含少于100个口袋。

解题思路:遍历所有点,求出连通块的数量,每到一块油田,就采用DFS或者BFS消除该油田以及附近连通的油田。

简单dfs(直接上代码)

package 简单搜索;

import java.util.Scanner;

/**
* Created by user on 2017/8/23.
*/
public class hdu1241 {
/**
* 联通快
*/
static int MAX_N=100+2;
static char map[][]=new char[MAX_N][MAX_N];
static int n,m;
static boolean vis[][]=new boolean[MAX_N][MAX_N];//用来标记是否是联通快
static int dir[][] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
public static void main(String args[]){
Scanner scanner=new Scanner(System.in);
while (scanner.hasNext()){
n=scanner.nextInt();
m=scanner.nextInt();
if(n+m==0){
break;
}
scanner.nextLine();
for(int i=0;i<n;i++){
String str=scanner.nextLine();
char a[]=str.toCharArray();
for(int j=0;j<m;j++){
map[i][j]=a[j];
}
}
int sum=0;
init();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!vis[i][j]&&map[i][j]=='@'){//当从每个点出发搜索的时候 都会标记以改点扩散的油田 当从下个点搜索的时候
sum++;//就直接不搜索改点
dfs(i,j);
}
}
}
System.out.println(sum);
}

}

private static void dfs(int x, int y) {
vis[x][y]=true;
for(int i=0;i<8;i++){
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(dx>=0&&dx<n&&dy>0&&dy<m&&!vis[dx][dy]&&map[dx][dy]=='@'){
dfs(dx,dy);
}
}
}

private static void init() {
for(int i=0;i<MAX_N;i++){
for (int j=0;j<MAX_N;j++){
vis[i][j]=false;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdu1241 dfs 联通快 java