Java计算网格中的连接区域

时间:2014-06-18 18:55:01

标签: java arrays recursion grid

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

示例输入是:

  

10 20

     

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

     

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

     

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

     

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

     

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

     

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

     

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

     

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

     

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

     

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

输出应为:

  
    

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

         

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

         

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

         

6 0 0 0 0 0 0 0 3 3 0 0 7 0 0 0 5 5 5 0

         

6 6 0 6 0 0 0 3 3 3 0 0 0 8 8 0 5 5 0 0

         

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

         

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

         

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

         

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

  
     

10 0 6 6 6 6 6 0 0 0 0 0 0 0 8 8 0 8 0 0

现在当我运行我的代码时,我得到了这个输出:

  

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

     

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

     

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

     

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

     

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

     

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

     

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

     

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

     

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

     

2 0 2 2 2 2 2 0 0 0 0 0 0 0 2 2 0 2 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();
        }
    }
}

我不确定自己做错了什么,我相信每次都会让我反击。有没有人建议问题可能是什么?

提前致谢。

0 个答案:

没有答案