Java 如何使用递归在二维数组中标记组?

Java 如何使用递归在二维数组中标记组?,java,arrays,recursion,multidimensional-array,Java,Arrays,Recursion,Multidimensional Array,我需要在代码中编写一个方法,该方法可以获取二维数组并返回数组中有多少不同的组。组被定义为“在上/下/左/右(非对角线)方向上直接连接到其他单元格的所有单元格”,其中数组中的单元格用星号表示。我需要编写一个遍历整个数组的方法,该方法还调用一个递归方法,将每个星号更改为该组特有的字母。例如,这是一个示例输入: char图像[][]={ {'*','*',' ',' ',' ',' ',' ',' ','*',' '}, {' ','*',' ',' ',' ',' ',' ',' ','*',' '

我需要在代码中编写一个方法,该方法可以获取二维数组并返回数组中有多少不同的组。组被定义为“在上/下/左/右(非对角线)方向上直接连接到其他单元格的所有单元格”,其中数组中的单元格用星号表示。我需要编写一个遍历整个数组的方法,该方法还调用一个递归方法,将每个星号更改为该组特有的字母。例如,这是一个示例输入:

char图像[][]={
{'*','*',' ',' ',' ',' ',' ',' ','*',' '},
{' ','*',' ',' ',' ',' ',' ',' ','*',' '},
{' ',' ',' ',' ',' ',' ','*','*',' ',' '},
{' ','*',' ',' ','*','*','*',' ',' ',' '},
{' ','*','*',' ','*',' ','*',' ','*',' '},
{' ','*','*',' ','*','*','*','*','*','*'},
{' ',' ',' ',' ',' ',' ',' ',' ','*',' '},
{' ',' ',' ',' ',' ',' ',' ',' ','*',' '},
{' ',' ',' ','*','*','*',' ',' ','*',' '},
{' ',' ',' ',' ',' ','*',' ',' ','*',' '}};
输出结果如下:

    aa      b 
     a      b 
          cc  
     d  ccc   
     dd c c c 
     dd cccccc
            c 
            c 
       eee  c 
         e  c 

我主要需要迭代给定图像的方法的帮助,因为我不知道如何使代码区分组。

您的概念应该是这样的

checkField (x, y, char)
  x,y is out of bounds; return;

  if current field has asterix do
     current field = char; // Prevents new checks!
     checkField (x+1, y, char); // right field
     checkField (x+-1,y, char); //l left field 
     // top and bottem field.
  else do
    // Advance to next Field; Next field has to be in bounds. At the end of the line you have to go to the next line;
    checkField( .., ..., char++)
end;
第一个调用是
checkField(0,0,'a')

您需要创建一个新的字符数组。这将是一个实例变量

可以将x,y矩阵建模为数组。其中x mod y是一条线。这将使进步更容易。但不那么直观


尝试实现伪代码,并随时详细更新您的问题。

您需要两种方法。一个用来迭代给定的图像,另一个用给定的名称在点(i,j)上画星号

迭代给定的图像非常简单

public char[]iterateThrough(char[]image,int行,int列){
//这就是结果。
字符[][]输出=新字符[][行];
//用“\0”填充结果
对于(int i=0;i
现在,这是如何绘制星号

public void drawAsterisk(char[][]图像,char[][]结果,int i,int j,char name,int行,int列){
//如果点(i,j)属于星号,则在点(i,j)处绘制
如果(图像[i][j]='*'){
结果[i][j]=名称;
//右转
如果(i+1<行){
drawAsterisk(图像、结果、i+1、j、名称、行、列);
}
//左转
如果(i-1>=0){
drawAsterisk(图像、结果、i-1、j、名称、行、列);
}
//打底
如果(j+1<列){
drawAsterisk(图像、结果、i、j+1、名称、行、列);
}
//平顶
如果(j-1>=0){
drawAsterisk(图像、结果、i、j-1、名称、行、列);
}
}
}

提示:迭代数组,找到内容“*”后,分配一个标签并检查它是否连接到4个相邻单元格(可以使用递归检查方法),用相同的标签标记任何相邻单元格。如果没有发现更多单元格正在连接,则继续迭代。保留一个组中已有单元格的列表,这样您就不会重新检查或标记它们。