【问题标题】:Finding the diagonals of any random point in a square 2D array查找正方形二维数组中任意随机点的对角线
【发布时间】:2016-03-15 15:13:43
【问题描述】:

我必须编写设置一个 8x8 矩阵、一个棋盘的代码,然后询问用户他们想在哪一行和哪一列放置皇后。然后我必须在女王可以移动的每个方格上放一个 *。在女王可以移动的行和列上放一个 * 并不困难,但我无法正确标记女王可以移动的对角线。这是我迄今为止编写的尝试定位对角线的代码:

    char[][] chessboard = new char[8][8];
            System.out.print("What row do you want to place the queen on? ");
            int row = console.nextInt();
            System.out.print("What column do you want to place the queen on? ");
            int column = console.nextInt();

            char queen = 'Q';
            chessboard[row - 1][column - 1] = queen;

            // column and rows
            for (int i = 0; i < chessboard.length; i++) {
                for (int j = 0; j < chessboard[0].length; j++) {
                    if ((i == 2 || j == 6) && chessboard[i][j] != queen) {
                        chessboard[i][j] = '*';
                    }
                }
            }

            if ((row - 1) != 0) {
                // left diagonal
                for (int i = 0; i < row; i++) {
                    for (int j = (column - 1 - (row - 1)); ((column - 1) - (row - 1)) <= j && j < column; j++) {
                        if (chessboard[i][j] != queen) {
                            chessboard[i][j] = '*';
                        }
                    }
                }
                for (int i = (row - 1) + (8 - (column)); i >= row - 1; i--) {
                    for (int j = 7; j >= (column - 1); j--) {
                        if (chessboard[i][j] != queen) {
                            chessboard[i][j] = '*';
                        }
                    }
                }

                // right diagonal
                for (int i = 7; i >= row - 1; i--) {
                    for (int j = (column - 1 - (row - 1)); 0 <= j && j < column; j--) {
                        if (chessboard[i][j] != queen) {
                            chessboard[i][j] = '*';
                        }
                    }
                }

            }
 for (int i = 0; i < chessboard.length; i++) {
            for (int j = 0; j < chessboard[0].length; j++) {
                System.out.print(chessboard[i][j] + " ");
            }
            System.out.println();
        }
    }

当我输入实验值时,例如第 3 行和第 7 列,我得到一个非常混乱的输出。对于上面的数字,我得到:

[][][][] * * * [] 
[][][][] * * * [] 
* * * *  * * Q  * 
* * * * * [] *  * 
* * * * * [] * [] 
* * * * * [] * [] 
* * * * * [] * [] 
* * * * * [] * []

谁能告诉我哪里出错了? * 这是一个家庭作业问题,所以请只在答案中编码。谢谢!

【问题讨论】:

  • 方括号在你的输出中代表什么?
  • @ManoDestra 它们应该是空矩阵槽。这就是它们在我计算机上 Intellij-idea 中的显示方式。
  • 如果是我,我会简单地遍历棋盘的每个方格,并在三个可能的规则中测试每个方格的有效性作为皇后可以移动的一个方格,即(方格.x == queen.x || square.y == queen.y || square.x - queen.x == square.y - queen.y)。如果您的方格符合上述任何规则,那么它是一个有效的方格,否则它不是。当然,忽略女王当前所在的方格(square.x != queen.x && square.y != queen.y)。有意义吗?
  • @ManoDestra 我没想到会这样,谢谢!

标签: java arrays loops matrix intellij-idea


【解决方案1】:

如果是我,我会简单地遍历棋盘的每个方格,并在三个可能的规则中测试每个方格的有效性,即后可以移动到的方格,即

square.x == queen.x ||
square.y == queen.y ||
|square.x - queen.x| == |square.y - queen.y|

如果您的方格符合上述任何一条规则,那么它是可以移动到的有效方格,否则不是。当然,省略女王当前所在的方格

square.x != queen.x && square.y != queen.y

伪代码:

for (int i = 0; i < chessboard.length; i++) {
    for (int j = 0; j < chessboard[0].length; j++) {
        // You could encapsulate these lines in a isValidSquareForQueenMove(x, y) method.
        boolean isSquareValid = false;
        isSquareValid = isSquareValid || x == queen.x;
        isSquareValid = isSquareValid || y == queen.y;
        isSquareValid = isSquareValid || Math.abs(queen.x - x) == Math.abs(queen.y - y);
        isSquareValid = isSquareValid && x != queen.x && y != queen.y;

        // Do stuff here.
    }
}

【讨论】:

  • 我想补充一点,queen.x - x == queen.y - y 找到一个对角线,但 queen.x - x == y - queen.y 找到第二个,所以代码应该是已添加。
  • 啊,是的,对不起。不过,您可以只检查差异的模值。我将更新答案以使用 Math.abs 以便一个逻辑管理两个对角线。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多