GeoSurvComp地质调查公司负责检测地下石油储量。GeoSurvComp一次与一个大的矩形区域一起工作,并创建一个网格,将土地划分为多个方形图。然后,它使用传感设备分别分析每个图,以确定该图是否含有油。含有油的地块称为口袋。如果两个口袋相邻,则它们是相同油藏的一部分。油沉积物可能非常大并且可能包含许多口袋。您的工作是确定网格中包含多少不同的油藏。
输入
输入包含一个或多个网格。每个网格都以包含m和n的行开头,即网格中的行数和列数,由单个空格分隔。如果m = 0,则表示输入结束; 否则1 <= m <= 100并且1 <= n <= 100.此后是m行,每行n个字符(不计行行尾字符)。每个字符对应一个图,并且是“*”,表示没有油,或“@”,表示油口袋。
产量
水平,垂直或对角相邻。油藏不得超过100个口袋。
样本输入
1 1
*
3 5
@@*
@
@@*
1 8
@@***@
5 5
****@
@@@
@**@
@@@@
@@**@
0 0
样本输出
0
1
2
2
解:dfs,遍历全图,遇到@并且没有被标记,sum+1,然后进入dfs深搜,再将能够和它有关系的@都标记一下
import java.util.Scanner;
public class Main {
int k,n,sum;
String[] str = new String[110]; //图
int[][] vis = new int[110][110]; //标记
int[][] dir = new int[][]{{1,0},{0,1},{-1,0},{0,-1},{1,1},{-1,1},{-1,-1},{1,-1}};//方向
public static void main(String[] args) {
Main s = new Main();
Scanner cin = new Scanner(System.in);
while(cin.hasNext())
{
s.n = cin.nextInt(); //高
s.k = cin.nextInt(); //宽
s.init();
if(s.k==0 && s.n==0)
{
break;
}
String string = cin.nextLine();
for(int i=0;i<s.n;i++)
{
s.str[i]=cin.nextLine();
}
s.sum = 0;
for(int i=0; i<s.n; i++)
{
for(int j=0;j<s.k;j++)
{
char c = s.str[i].charAt(j);
if(c=='@'&&s.vis[i][j]==0)
{
s.vis[i][j]=1;
s.sum++;
s.dfs(i,j);
}
}
}
System.out.println(s.sum);
}
}
public void init()
{
for(int i=0;i<110;i++)
{
for(int j=0;j<110;j++)
{
vis[i][j]=0;
}
}
}
public boolean Check(int x,int y)
{
if(x>=0 && y>=0 && x<n && y<k)
{
if(vis[x][y]==0 && str[x].charAt(y)=='@')
{
return true;
}
}
return false;
}
public void dfs(int x,int y)
{
for(int i=0;i<8;i++)
{
int u = x+dir[i][0];
int v = y+dir[i][1];
if(Check(u,v))
{
vis[u][v]=1;
dfs(u, v);
}
}
}
}