【问题标题】:Eight Queens - Diagonal Movement八皇后 - 对角线运动
【发布时间】:2014-11-14 20:21:11
【问题描述】:

我有一个 8 x 8 棋盘,我正在尝试实现八皇后拼图。在我的游戏中,我创建了一个检查皇后移动的函数,一旦在我的棋盘上按下一个按钮,特定皇后可以移动的所有行和列都会被关闭,这样就不会有两个皇后相互攻击。但是我被困住了,试图弄清楚如何在我的代码中关闭所有对角线按钮。

private JButton[][] Squares = new JButton[8][8];
for (int i = 0; i < Squares.length; i++) {
                for (int j = 0; j < Squares[i].length; j++) {
                    if(Squares[i][j].getModel().isPressed()){
                    for (int x=0; x<8; x++){
                        Squares[i][x].setEnabled(false); //turns off column buttons
                        Squares[x][j].setEnabled(false); //turns off row buttons
                        //Squares[i][j+1].setEnabled(false);
                        //Squares[i+1][j-1].setEnabled(false);


        }

一旦皇后被放在棋盘上,我需要做什么才能禁用所有对角按钮?

编辑:我注意到如果我这样做Squares[x][x].setEnabled(false);,那么它会给我两个对角线之一,但是这只给出对角线一次,然后单击第二个按钮后一切都会中断。

【问题讨论】:

  • 您注意到主对角线上正方形的坐标是什么?那上面对角线上的正方形的坐标呢?
  • 老实说,我不确定,无论我尝试什么,我都遇到了错误,最终我陷入了困境。我知道,如果我尝试增加一个,有时我会得到一个对角线,但由于我每次尝试时都在硬编码,如果我在最后一列/行上,我经常会遇到错误。

标签: java algorithm n-queens


【解决方案1】:

您从[i][j] 开始,并在两行和一列上并行推进(使用循环变量x)。唯一棘手的部分是如何避免从板的边缘掉下来。请注意,与行/列不同,您的对角线不一定有 8 个正方形

一种方法是,在x 上使用相同的基本循环,是 -

if (i+x < Squares.length && j+x < Squares[i].length)
    Squares[i+x][j+x].setEnabled(false);             
if (i-x >= 0 && j-x >= 0)
    Squares[i-x][j-x].setEnabled(false);             
if (i-x >= 0 && j+x < Squares[i].length)
    Squares[i-x][j+x].setEnabled(false);             
if (i+x < Squares.length && j-x >=0)
    Squares[i+x][j-x].setEnabled(false); 

【讨论】:

    【解决方案2】:

    我不确定我是否收到了您的问题。如果您正在寻找一种方法来在皇后放置时选择所有对角单元格,那么已知这些单元格将出现在|i-j|(即绝对值)中。这是一个代码,每当按下Squares[indx1,indx2] 时,都会对对角线单元格做一些事情......这有意义吗?

    public static void pressed(int indx1,int indx2){
        // Squares[indx1][indx2] is pressed
        // Assign 1 to diagonal cells 
        for(int i=0;i<Squares.length;i++)
        for(int j=0;j<Squares.length;j++)
            if(Math.abs(indx1-i)==Math.abs(indx2-j))
                Squares[i][j]=1;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-24
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 2021-08-23
      相关资源
      最近更新 更多