二维布尔数组的垂直、水平和对角线赋值

3
老实说,我可能在想得太多了,但如果你有一个boolean[8][8]数组,并且其中一个值为true,那么如何使所有水平、垂直和对角线的值也为true呢?
例如,给定[X],如何使其他所有值也变为X:
0 0 X 0 0  X  0 0
0 0 0 X 0  X  0 X
0 0 0 0 X  X  X 0
X X X X X [X] X X
0 0 0 0 X  X  X 0
0 0 0 X 0  X  0 X
0 0 X 0 0  X  0 0
0 X 0 0 0  X  0 0

现在我可以垂直和水平移动:

for(int i = 0; i < 8; i++){
    for (int l = 0; l < 8; l++){
        if (boolean[i][l]){
            for (int k = 0; k < 8; k++){
                boolean[i][k] = true;
                boolean[k][l] = true;}
            }
        }
   }
3个回答

1

首先,在你的循环中,一旦找到第一个真值,你需要一个打破变量。我建议在for循环中使用布尔型isFound作为其中一个条件。除此之外,这就是我如何处理它的(注意:这将放置在你的循环中垂直/水平的下方):

//positive slope diagonal
if(((i - Math.min(i, l)) + k) < 8 && ((l - Math.min(i, l)) + k) < 8)
    testArray[(i - Math.min(i, l)) + k][(l - Math.min(i, l)) + k] = true;

//negative slope diagonal
if((k) < 8 && ((l + i) - k) >= 0 && ((l + i) - k) < 8)
    testArray[k][(l + i) - k] = true;

在这个例子中,对角线被分开成两部分。对于第一个对角线,我要检查它的位置是否在数组的范围内(我稍后会解释如何确定位置)。其次,我确定每个对角线的起始位置的X和Y值,位于括号中。最后,我通过从起始位置开始向X和Y方向移动K个单位(逐步)来找到位置,以便遍历带有对角线的网格。反向对角线也会重复相同的操作,但是X值将减去K而不是加上K,因为对角线指向相反的方向。最好通过调整位置或绘制算法来查找起始位置和移动的确切逻辑。

例如。 “输入图像描述”src

放置(请注意,我添加了变量以确保在找到真正的值后停止):

    boolean notFound = true;

    for(int i = 0; i < 8 && notFound; i++){
        for (int l = 0; l < 8 && notFound; l++){
            if (testArray[i][l]){
                for (int k = 0; k < 8; k++){
                    testArray[i][k] = true;
                    testArray[k][l] = true;

                    if(((i - Math.min(i, l)) + k) < 8 && ((l - Math.min(i, l)) + k) < 8)
                        testArray[(i - Math.min(i, l)) + k][(l - Math.min(i, l)) + k] = true;

                    if((k) < 8 && ((l + i) - k) >= 0 && ((l + i) - k) < 8)
                        testArray[k][(l + i) - k] = true;       
                }
                notFound = false;
             }
         }
     }

代码应该放在哪里?是在第三个循环内还是在第二个循环的if语句内部?因为如果将代码放在第三个循环内,它就无法正常工作。 - Michael Markidis

0
这是一个完整的工作示例,解决了这个问题。请参阅代码中的注释以获取更多详细信息:
public class Boolean_Array
{
    private static final int SIZE = 8;

    public static void main(String[] args)
    {
        // create the boolean array
        boolean [][] boolArr = new boolean [SIZE][SIZE];

        // 1. Set the row, col of the true
        int row = 3;
        int col = 5;

        // 2. Make the vertical, horizontal and diagonals true
        for (int i = 0; i < SIZE; i++)
        {
            // Do the vertical and horizontal
            boolArr[row][i] = true;
            boolArr[i][col] = true;

            // Do the diagonals
            setDiagonol(boolArr, row - i, col - i, i); // up and to the left
            setDiagonol(boolArr, row - i, col + i, i); // up and to the right
            setDiagonol(boolArr, row + i, col - i, i); // down and to the left
            setDiagonol(boolArr, row + i, col + i, i); // down and to the right
        }

        print(boolArr);
    }

    private static void setDiagonol (boolean [][] boolArr, int row, int col, int i)
    {
        try
        {
            boolArr[row][col] = true;
        }
        catch (java.lang.ArrayIndexOutOfBoundsException aioobe)
        {
            // catching for convenience so we don't have to check the bounds
        }
    }

    private static void print (boolean [][] boolArr)
    {
        for (int i = 0; i < SIZE; i++)
        {
            for (int j = 0; j < SIZE; j++)
            {
                System.out.print(boolArr[i][j] == true ? "X " : "0 ");
            }
            System.out.println();
        }
    }
}

输出:

0 X 0 0 0 X 0 0 
0 0 X 0 0 X 0 0 
0 0 0 X 0 X 0 X 
0 0 0 0 X X X 0 
X X X X X X X X 
0 0 0 0 X X X 0 
0 0 0 X 0 X 0 X 
0 0 X 0 0 X 0 0 

0

主类

public static void main(String[] args) {
    printGrid(3, 2);
    System.out.println();

    printGrid(5, 4);
    System.out.println();

    printGrid(7, 0);
    System.out.println();
}

public static void printGrid(int x, int y) {
    boolean[][] grid = new boolean[8][8];

    for (int i = 0; i < grid.length; i++) {
        for (int l = 0; l < grid[0].length; l++) {

            // horizontal and vertical
            if (x == i || y == l) {
                grid[i][l] = true;
            }

            // diagonals
            if (Math.abs(x - i) == Math.abs(y - l)) {
                grid[i][l] = true;
            }

            System.out.print(String.format("%-2s", grid[i][l] == true ? "X" : "O"));
        }

        System.out.println();
    }
}

输出

X O X O X O O O 
O X X X O O O O 
X X X X X X X X 
O X X X O O O O 
X O X O X O O O 
O O X O O X O O 
O O X O O O X O 

O O O O X O O O 
X O O O X O O O 
O X O O X O O X 
O O X O X O X O 
O O O X X X O O 
X X X X X X X X 
O O O X X X O O 
O O X O X O X O 

X O O O O O O X 
X O O O O O X O 
X O O O O X O O 
X O O O X O O O 
X O O X O O O O 
X O X O O O O O 
X X O O O O O O 
X X X X X X X X

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接