在Java字符行中查找形状

在Java字符行中查找形状,java,arrays,list,count,shape,Java,Arrays,List,Count,Shape,我在思考如何从字符行中获取形状时遇到了一个问题,例如,给定以下输入: AAAAAAAA ABBBAABA ABABABBB ABBBAAAA AAAABBAA ABBABBAA ABBABBAA ABAABBAA 任务: 计算有多少形状是由水平或垂直相邻的“B”字母构成的。 在这个例子中有4个这样的形状。 如果我删除“A”,可能更容易看到: BBB B B B BBB BBB BB BB BB BB BB B BB 其他任务: 每个形

我在思考如何从字符行中获取形状时遇到了一个问题,例如,给定以下输入:

AAAAAAAA    
ABBBAABA
ABABABBB
ABBBAAAA
AAAABBAA
ABBABBAA
ABBABBAA
ABAABBAA
任务: 计算有多少形状是由水平或垂直相邻的“B”字母构成的。 在这个例子中有4个这样的形状。 如果我删除“A”,可能更容易看到:

 BBB  B 
 B B BBB
 BBB    
    BB  
 BB BB  
 BB BB  
 B  BB  
其他任务: 每个形状中有多少个“B”字符? 在本例中:8、4、5、8(不按任何特定顺序)

我对Java还是新手,所以我想问,是否有任何Java函数可以检查彼此相邻的相同事件,以便计算形状出现的次数?希望你能给我一些关于如何构造这个算法的建议。 (我曾想取“B”的每个索引,并检查它们是否接近其他“B”,但我被卡住了)

int indexCount=0;
ArrayList=新建ArrayList();
对于(int a=0;a
方法
indexof(int-ch)
返回字符串中一个共享字符的第一个索引。在得到第一个B的索引后,应该剪切每个字符串

或者您可以使用
indexOf(int ch,int fromIndex)
返回指定字符第一次出现时该字符串内的索引,从指定索引开始搜索

我对Java还是新手,所以我想问,是否有任何Java函数可以检查彼此相邻的相同事件,以便计算形状出现的次数

不,没有内置的功能使这非常容易。 这就是练习的重点

以下是一些可用于解决此问题的示例方法:

  • :

    • 将输入转换为矩阵。它可以是一个
      boolean[][]
      ,您可以在其中设置
      true
      ,其中输入为
      B
    • 迭代矩阵中的值,跳过
      false
    • 当发现
      true
      值时,启动泛洪填充:
      • 增加形状数(您发现了一个新形状)
      • 递归地将所有相邻的
        true
        值替换为
        false
        ,并在执行时递增
        shapeSize
        计数
      • 当所有
        true
        邻域(以及邻域的邻域,等等)都替换为
        false
        时,将充分探索形状
      • 继续停止的迭代,直到找到另一个
        true
  • 图论:发现

    • 将输入转换为无向图:
      • 每个字符的索引可以是顶点id
      • 为输入中相邻的
        B
        对创建连接
    • 在图的顶点上迭代
    • 如果某个顶点还没有组件id,请使用深度优先搜索查找与其连接的所有顶点,将下一个组件id指定给所有顶点,同时递增
      componentSize
      计数
    • 当不再有连接的顶点时,将完全探索形状
    • 继续停止的迭代,直到找到另一个没有组件id的顶点
  • :这类似于查找连接的组件

要求不明确。这个给定输入的预期输出是什么?@janos我刚刚编辑过,谢谢您的时间!我改为indexOf(0,a),但它给出了这个结果[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]。对了,谢谢你的回复!您应该编写
indexCount=array[a].indexOf('B',indexCount+1);列表。添加(索引计数)非常感谢您的回复。我解决了我的问题,它类似于洪水填充法。再次感谢!
int indexCount = 0;
ArrayList<Integer> list = new ArrayList<Integer>();

for(int a = 0; a < count; a++) {
    indexCount = array[a].indexOf('B');
    list.add(indexCount);
}

System.out.println(list);