杭电1241java实现dfs

简介: GeoSurvComp地质调查公司负责检测地下油藏。 GeoSurvComp一次与一个大的矩形区域一起工作,并创建一个网格,将网格划分为多个方块。然后分别分析每个地块,使用传感设备确定该地块是否含有油。含油的情节被称为口袋。如果两个口袋相邻,则它们是同一个油藏的一部分。油藏可能相当大,可能含有大量的口袋。你的工作是确定网格中包含多少个不同的油藏。

问题描述



GeoSurvComp地质调查公司负责检测地下油藏。 GeoSurvComp一次与一个大的矩形区域一起工作,并创建一个网格,将网格划分为多个方块。然后分别分析每个地块,使用传感设备确定该地块是否含有油。含油的情节被称为口袋。如果两个口袋相邻,则它们是同一个油藏的一部分。油藏可能相当大,可能含有大量的口袋。你的工作是确定网格中包含多少个不同的油藏。


输入


输入文件包含一个或多个网格。每个网格以含有m和n的行开始,网格中的行和列的数量由一个空格分隔。如果m = 0,则表示输入结束;否则1 <= m <= 100和1 <= n <= 100.之后是每行有n行的m行(不包括行尾字符)。每个字符对应一个图,既可以代表没有油的`*’,也可以代表一个油袋。


产量


对于每个电网,输出不同油量的数量。如果两个不同的口袋是水平,垂直或对角相邻的,则它们是同一个油藏的一部分。一个油藏不会超过100个口袋。


示例输入


1 1

*

3 5


@ * @ *

** ** @

@ * @ *

1 8

@@ **** @ *

5 5

**** @

@@ * @

@ ** @

@@@ * @

@@ ** @

0 0


示例输出


0

1

2

2


思路:刚开始我以为是常规搜索题,当时想着遍历,标记,找相邻的,周围的,但是却发现可能后出现的会连结已经遍历过的,并且那个油田也不好表示,不能超过100不好判断。后来就看了别人学习了一下换了一种思路,找到油田的那个点开始遍历,遍历周围和他成为一个油田的所有满足条件的(包括100),把遍历过的点设为不可遍历。找到一个@就dfs一次,油田数量就增加一次。注意参数的重置问题。


代码如下:


import java.util.Scanner;
public class 杭电1241 {
  static int d[][]= {{-1,0},{-1,1},{-1,-1},{0,1},{0,-1},{1,0},{1,-1},{1,1}};//八个方向
  static int m,n,number,value;
  static char a[][];
  public static void main(String[] args)
  {
    Scanner sc=new Scanner(System.in);
    while(sc.hasNext())
    {
       m=sc.nextInt();//行
       n=sc.nextInt();//列
      if(m==0&&n==0)break;
      sc.nextLine();
       a=new char[m][n];
      for(int i=0;i<m;i  )
      {
        String a1=sc.nextLine();
        a[i]=a1.toCharArray();
      }     
      for(int i=0;i<m;i  )
      {
        for(int j=0;j<n;j  )
        {
          if(a[i][j]=='@')
          {a[i][j]='*';number=0;dfs(i,j);value  ;}
        }
      }
      System.out.println(value);
      value=0;
    }   
  }
  private static void dfs(int x1, int y1) {
    for(int i=0;i<8;i  )      
    {
      if(x1 d[i][1]>=0&&x1 d[i][1]<m&&y1 d[i][0]>=0&&y1 d[i][0]<n)//不超届;
      {
        if(a[x1 d[i][1]][y1 d[i][0]]=='@'&&number<100)
        {
          a[x1 d[i][1]][y1 d[i][0]]='*';
          dfs(x1 d[i][1],y1 d[i][0]);
        }
      }
    }   
  }
}
目录
相关文章
|
8月前
|
Java
【Java每日一题,dfs】矩阵查找字符串
【Java每日一题,dfs】矩阵查找字符串
|
8月前
|
机器学习/深度学习 Java
【Java每日一题,dfs】Find The Multiple
【Java每日一题,dfs】Find The Multiple
|
8月前
|
机器学习/深度学习 Java
【Java每日一题,dfs】洛谷P1162 填涂颜色
【Java每日一题,dfs】洛谷P1162 填涂颜色
|
8月前
|
机器学习/深度学习 Java
【Java每日一题,深度搜索dfs】棋盘问题
【Java每日一题,深度搜索dfs】棋盘问题
|
8月前
|
Java
【Java每日一题,dfs】挖出最大财宝
【Java每日一题,dfs】挖出最大财宝
|
5天前
|
数据采集 算法 Java
DFS(深度搜索)无向图遍历(JAVA手把手深入解析)
DFS(深度搜索)无向图遍历(JAVA手把手深入解析)
47 0
|
8月前
|
机器学习/深度学习 Java
【Java每日一题,dfs】[USACO1.5]八皇后 Checker Challenge
【Java每日一题,dfs】[USACO1.5]八皇后 Checker Challenge
|
8月前
|
Java
【Java每日一题,dfs】哈密顿绕行世界问题
【Java每日一题,dfs】哈密顿绕行世界问题
|
11月前
|
Java
数据结构(11)图的遍历,DFS、BFS的JAVA实现
11.1.图的遍历 图的遍历,即将图内所有顶点都访问一遍。 有两种遍历方式: BFS DFS 以下图的遍历为例:
62 0
|
人工智能 Java BI
力扣207:课程表(Java拓扑排序:bfs+dfs)
力扣207:课程表(Java拓扑排序:bfs+dfs)
103 0