计算二维数组中相邻元素的程序给出不一致的结果

Program counting adjacent elements in a 2D array gives inconsistent results

我有一段程序要填。它应该计算 5 x 5 二进制矩阵中的相邻数字。例如像这样的矩阵:

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

应该return8,只能水平或垂直移动

这是生成这些矩阵的代码,完成后无法进行任何修改。

import java.util.Random;

public class Test {

public static void main(String[] args) {
    final Random r = new Random();


    for (int kerrat = 0; kerrat < 10; kerrat++) {
        int[][] alkioTaulukko = new int[5][5];

        System.out.println("Matriisin");
        for (int i = 0; i < alkioTaulukko.length; i++) {
            System.out.print("");
            for (int j = 0; j < alkioTaulukko[i].length; j++) {
                alkioTaulukko[i][j] = r.nextInt(2);
                System.out.print("" + alkioTaulukko[i][j] + " ");
            }
            System.out.println("");
        }

        System.out.print("suurimman yhtenäisen alueen koko on ");
        System.out.println(laskeSuurinAlue(alkioTaulukko));
        System.out.println("");
    }

}

}

最后这是我对问题的解决方案。

static int  laskeSuurinAlue(int[][] matriisi) {

    int vierekkaiset = 0;

    int rivi = matriisi.length;
    int palkki = matriisi[0].length;

    for (int r = 0; r < rivi; r++)
    {
        for (int p = 0; p < palkki; p++)
        {
            if ((p+1 < palkki) && (matriisi[r][p] == matriisi[r][p+1]))//loops through the rows
                vierekkaiset++;

            if ((r+1 < rivi) && (matriisi[r][p] == matriisi[r+1][p]))//loops through the columns
                vierekkaiset++;
        }
    }
    return vierekkaiset;
}

发生的事情是我的解决方案总是产生太大的结果,而且我没有看到每个 运行 之间的任何模式。但是,如果我使用这样的较小矩阵:

int[][] array = {{1, 0, 1}, {0, 1, 1}, {0, 1, 0}};

正确的结果是4。

如果我像这样使用更大的:

int[][] arr = {{1,0,1,1,0},
            {0,0,1,0,0},
            {0,0,1,0,1},
            {1,1,1,0,1},
            {0,0,1,0,0}
    };

结果总是 20。

最后是我当前状态下的代码:

    import java.util.Random;

    import static java.util.Arrays.deepToString;

    public class Test {
    public static void main(String[] args) {
    final Random r = new Random();
    int[][] array = {{1, 0, 1}, {0, 1, 1}, {0, 1, 0}};
    int[][] arr = {{1,0,1,1,0},
            {0,0,1,0,0},
            {0,0,1,0,1},
            {1,1,1,0,1},
            {0,0,1,0,0}
    };
    for (int kerrat = 0; kerrat < 10; kerrat++) {
        int[][] alkioTaulukko = new int[5][5];

        System.out.println("Matriisin");
        for (int i = 0; i < alkioTaulukko.length; i++) {
            System.out.print("");
            for (int j = 0; j < alkioTaulukko[i].length; j++) {
                alkioTaulukko[i][j] = r.nextInt(2);
                System.out.print("" + alkioTaulukko[i][j] + " ");
            }
            System.out.println("");
        }

        System.out.print("suurimman yhtenäisen alueen koko on ");
        System.out.println(laskeSuurinAlue(arr));//Change to arr,array or alkioTaulukko to run the code with different matrices
        System.out.println(deepToString(arr));
        System.out.println("");

    }

}


static int  laskeSuurinAlue(int[][] array) {


    int counter = 0;

    int rowLimit = array.length;
    int colLimit = array[0].length;

    for (int r = 0; r < rowLimit; r++)
    {
        for (int c = 0; c < colLimit; c++)
        {
            if ((c+1 < colLimit) && (array[r][c] == array[r][c+1]))
                counter++;

            if ((r+1 < rowLimit) && (array[r][c] == array[r+1][c]))
                counter++;
        }
    }
    return counter;
}

}

您不止一次计算同一个条目。 使用此代码

static int  laskeSuurinAlue(int[][] array) {
    int counter = 0;

    int rowLimit = array.length;
    int colLimit = array[0].length;

    for (int r = 0; r < rowLimit; r++)
    {
        for (int c = 0; c < colLimit; c++)
        {
            if (array[r][c] == 0) {
                continue;
            }

            int sum = array[r][c];
            sum += (r + 1 < rowLimit) ? array[r+1][c] : 0;
            sum += (c + 1 < colLimit) ? array[r][c+1] : 0;
            sum += (r - 1 >= 0 ) ? array[r-1][c] : 0;
            sum += (c - 1 >= 0) ? array[r][c-1] : 0;

            if (sum > 1) {
                counter++;
            }
        }
    }
    return counter;
}