在字符行中查找形状-Java

时间:2017-03-11 06:27:43

标签: 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  

附加任务: 每个形状中有多少'B'字符? 在此示例中:8,4,5,8(不按任何特定顺序)。

我还是Java的新手,所以我想问一下,是否有任何java函数可以检查相同的事件,以便计算出来的形状?希望你能给我一些关于如何构造这个算法的指针。 (我已经考虑过采用'B'的每个指数并检查它们是否接近其他'B'但我被卡住了)

3 个答案:

答案 0 :(得分:1)

  

我还是Java的新手,所以我想问一下,是否有任何java函数可以检查相同的事件,以便计算出形状?

不,没有内置功能可以让这很容易。 这就是演习的重点。

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

  • Flood fill

    • 将输入转换为矩阵。它可以是boolean[][],您可以在其中设置true,其中输入为B
    • 迭代矩阵中的值,跳过false值。
    • 当您找到true值时,请启动洪水填充:
      • 增加形状数量(找到新形状)
      • 使用true递归替换所有相邻的false值,随时增加shapeSize次数
      • 当所有true邻居(以及邻居的邻居等)被false替换时,形状将被充分探索
      • 继续您离开的迭代,直到找到另一个true
  • 图论:找connected components

    • 将输入转换为无向图:
      • 每个字符的索引可以是顶点id
      • 为输入
      • 中的相邻B对创建连接
    • 迭代图的顶点
    • 如果顶点还没有组件ID,请使用深度优先搜索来查找连接到它的所有顶点,为所有顶点分配下一个组件ID,为您增加componentSize计数去
    • 当没有更多连接的顶点时,完全探索形状
    • 继续您离开的迭代,直到找到另一个没有组件ID的顶点
  • Union find:这类似于查找连接的组件

答案 1 :(得分:0)

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);

答案 2 :(得分:0)

方法ActiveXXX返回String中的apearing字符的第一个索引。你应该在获得第一个B的索引后剪切每个字符串。

或者您可以使用Option Explicit Sub HandleRowsColorAndVisibility() Dim iRow As Long With Range("A8", Cells(Rows.count, 1).End(xlUp)) '<--| reference cells from A8 down to column A last not empty cell ResetRange .Cells '<--| first, bring range formatting and visibility back to a "default" state For iRow = .Rows.count To 1 Step -1 '<--| then start looping through range If WorksheetFunction.CountIf(Range("Name_Preps"), .Cells(iRow, 1)) = 1 Then '<-- if current cell matches your criteria ... FormatRange .Cells(iRow, 1), True, False, 0, xlColorIndexAutomatic, xlThemeColorAccent3, 0.4 '<--| then format it Else '<--| otherwise... .Rows(iRow).Hidden = True '<--| hide it! End If Next End With End Sub Sub ResetRange(rng As Range) rng.EntireRow.Hidden = False FormatRange rng, False, False, 0, xlColorIndexAutomatic, -4142, 0 End Sub Sub FormatRange(rng As Range, okBold As Boolean, okItalic As Boolean, myFontTintAndShade As Single, myPatternColorIndex As XlColorIndex, myInteriorThemeColor As Variant, myInteriorTintAndShade As Single) With rng With .Font .Bold = okBold .Italic = okItalic .TintAndShade = myFontTintAndShade End With With .Interior .PatternColorIndex = myPatternColorIndex .ThemeColor = myInteriorThemeColor .TintAndShade = myInteriorTintAndShade End With End With End Sub 返回指定字符第一次出现的字符串中的索引,从指定索引处开始搜索。