Java计算网格中的连通区域

Java计算网格中的连通区域,java,arrays,recursion,grid,Java,Arrays,Recursion,Grid,我正在尝试定位网格中所有四个连接的区域。一个四连通区域由一组标记单元(值1)组成,这样区域中的每个单元都可以通过从区域中的另一个标记单元向上、向下、向左或向右移动来到达。赋值说明我们应该使用递归 输入的一个例子是: 1020 01 01 01 01 01 00 01 01 01 01 01 01 01 01 01 01 0 01 0 01 0 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 0 0 1 0 0 1 0 1 0 0

我正在尝试定位网格中所有四个连接的区域。一个四连通区域由一组标记单元(值1)组成,这样区域中的每个单元都可以通过从区域中的另一个标记单元向上、向下、向左或向右移动来到达。赋值说明我们应该使用递归

输入的一个例子是:

1020

01 01 01 01 01 00 01 01 01 01 01 01 01 01 01 01 0 01 0 01 0

01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01

0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 1 1 1 1

1 0 0 0 0 1 0 0 1 0 0 0 1 1 0

1101001011001011001010101011010100

11110001001101000

01 01 01 01 01 01 01 01 01 01 01 01 01 01 00

01 11 11 01 01 01 01 01 01 01 01 01 11 10

0 0 0 1 0 0 0 1 0 0 1 0 1 0 1 0

101111100001010

输出应为:

01 01 0 0 2 0 3 0 0 0 0 0 0 4 0 0 0 5 0

01 11 02 03 04 04 05

0 0 1 0 0 2 0 3 0 0 0 4 0 0 0 5 5

600 0 0 0 0 3 3 0 0 7 0 0 0 5 0

06060003300080500

6 6 6 0 0 0 0 9 0 8 8 0 0 0 0 0 0 0

06060600099080808000

0666060609090080880

0 0 6 0 0 0 0 9 0 0 0 8 0 8 0 8 0

1066600800

现在,当我运行我的代码时,我得到以下输出:

020200200200200200200200200200200200200200

02 02 02 02 02 02 02 00 02 02 02 00 02

0 0 2 0 0 2 2 0 2 0 0 0 2 0 0 2 2 2 2

200 0 0 0 0 2 0 0 0 2 0 0 0 0 0 2 2 0

2 2 0 2 0 0 2 2 0 0 2 0 0 2 0 2 0 0

2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 0 0 0 0 0 0 0

02220022002200220022002200

022200220022002200220022002200220022002200220022002200

0 0 2 0 0 0 2 0 0 0 2 0 0 2 0 2 0

2 0 2 2 2 0 0 0 0 0 0 0 2 0 2 0 0 0

我的代码如下所示:

package project2;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;

public class project2 {

    private static int height;
    private static int length;

    public static void main(String[] args) {

        String inputFile;

        Scanner input = new Scanner(System.in);

        System.out.print("Enter input file name: ");
        inputFile = input.nextLine();

        try {
            Integer grid[][] = loadGrid(inputFile);

            System.out.println("Before flood fill");
            printGrid(grid);

            findGroups(grid, 0, 0, 2, height, length);

            System.out.println("After flood fill");
            printGrid(grid);
        } catch (IOException e) {
            System.err.println(e.getMessage());
        }
    }

    public static void findGroups(Integer[][] array, int column, int row,
            int counter, int height, int length) {
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < length; j++) {
                if (row < 0 || row >= length || column < 0 || column >= height) {
                } else {
                    if (array[i][j] == 1) {
                        array[i][j] = counter;
                        findGroups(array, column, row + 1, counter, height, length);
                        findGroups(array, column, row - 1, counter, height, length);
                        findGroups(array, column - 1, row, counter, height, length);
                        findGroups(array, column + 1, row, counter, height, length);
                        counter++;
                    }
                }
            }
        }
    }

    public static Integer[][] loadGrid(String fileName) throws IOException {

        FileInputStream fin;

        fin = new FileInputStream(fileName);

        Scanner input = new Scanner(fin);

        height = input.nextInt();
        length = input.nextInt();

        Integer grid[][] = new Integer[height][length];

        for (int r = 0; r < height; r++) {
            for (int c = 0; c < length; c++) {
                grid[r][c] = input.nextInt();
            }
        }
        fin.close();

        return (grid);
    }

    public static void printGrid(Integer[][] grid) {
        for (Integer[] grid1 : grid) {
            for (int c = 0; c < grid[0].length; c++) {
                System.out.printf("%3d", grid1[c]);
            }
            System.out.println();
        }
    }
}
package项目2;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.util.Scanner;
公共类项目2{
私有静态内部高度;
私有静态整数长度;
公共静态void main(字符串[]args){
字符串输入文件;
扫描仪输入=新扫描仪(System.in);
System.out.print(“输入文件名:”);
inputFile=input.nextLine();
试一试{
整数网格[][]=loadGrid(inputFile);
系统输出打印号(“洪水填充前”);
打印网格(网格);
FindGroup(栅格、0、0、2、高度、长度);
System.out.println(“洪水后填充”);
打印网格(网格);
}捕获(IOE异常){
System.err.println(e.getMessage());
}
}
公共静态void findGroup(整数[][]数组、int列、int行、,
整数计数器、整数高度、整数长度){
对于(int i=0;i=长度| |列<0 | |列>=高度){
}否则{
if(数组[i][j]==1){
数组[i][j]=计数器;
FindGroup(数组、列、行+1、计数器、高度、长度);
FindGroup(数组、列、行-1、计数器、高度、长度);
FindGroup(数组、列-1、行、计数器、高度、长度);
FindGroup(数组、列+1、行、计数器、高度、长度);
计数器++;
}
}
}
}
}
公共静态整数[][]loadGrid(字符串文件名)引发IOException{
文件输入流鳍;
fin=新文件输入流(文件名);
扫描仪输入=新扫描仪(fin);
高度=输入。nextInt();
length=input.nextInt();
整数网格[][]=新整数[高度][长度];
对于(int r=0;r
我不确定我做错了什么,我相信每次之后我都会把计数器向上移动。是否有人对可能出现的问题提出建议


提前感谢。

这是一个更适合代码审查的问题吗?什么是代码审查?很抱歉,我对该网站相当陌生。请尝试在此处询问您的问题: