poj-1562

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);
				 }
			 }
	 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值