Description
GeoSurvComp地质调查公司负责探测地下石油储藏。 GeoSurvComp现在在一块矩形区域探测石油,并把这个大区域分成了很多小块。他们通过专业设备,来分析每个小块中是否蕴藏石油。如果这些蕴藏石油的小方格相邻,那么他们被认为是同一油藏的一部分。在这块矩形区域,可能有很多油藏。你的任务是确定有多少不同的油藏。
Input
输入可能有多个矩形区域(即可能有多组测试)。每个矩形区域的起始行包含m和n,表示行和列的数量,1<=n,m<=100,如果m =0表示输入的结束,接下来是n行,每行m个字符。每个字符对应一个小方格,并且要么是'*',代表没有油,要么是'@',表示有油。
Output
对于每一个矩形区域,输出油田的数量。两个小方格是相邻的,当且仅当他们水平或者垂直或者对角线相邻(即8个方向)。
Sample Intput
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
Sample Output
0
1
2
2
思路:遍历每个点周围的8个方向。找是否有油田,如果有,则油田数量加1,并把该位置改变成没有油田的标志,防止重复搜索。
import java.util.Scanner;
public class YtDFS {
static int m,n;
static String [] map;
static int[][] vis;//访问过的路径
static int count;//总量
static int[][] move={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};//移动路径
static void dfs(int x,int y){
for(int i=0;i<8;i++){
int nearx = x + move[i][0];
int neary = y + move[i][1];
if(nearx>=0 && neary >=0 && neary<m && nearx<n && map[nearx].charAt(neary)== '@'
&& vis[nearx][neary]==0){
vis[nearx][neary]=1;
dfs(nearx,neary);
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
n = scanner.nextInt();
m = scanner.nextInt();
map = new String[n];
vis = new int[n][m];
count = 0;
if(n ==0 && m ==0){
break;
}
for(int i=0;i<n;i++){
map[i] = scanner.next();
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(map[i].charAt(j) == '@' && vis[i][j]==0){
count++;
vis[i][j]=1;
dfs(i,j);
}
}
}
System.out.println(count);
}
}
}