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