【问题标题】:How to Properly convert an Array Output in n-queens如何正确转换 n-queens 中的数组输出
【发布时间】:2015-05-26 15:28:09
【问题描述】:

我一直在玩这个代码一段时间。我想做的主要事情是对输出进行实验。以下是代码来源:1

他们使用的java代码如下:

public class Queens {

   /***********************************************************************
    * Return true if queen placement q[n] does not conflict with
    * other queens q[0] through q[n-1]
    ***********************************************************************/
    public static boolean isConsistent(int[] q, int n) {
        for (int i = 0; i < n; i++) {
            if (q[i] == q[n])             return false;   // same column
            if ((q[i] - q[n]) == (n - i)) return false;   // same major diagonal
            if ((q[n] - q[i]) == (n - i)) return false;   // same minor diagonal
        }
        return true;
    }

   /***********************************************************************
    * Print out N-by-N placement of queens from permutation q in ASCII.
    ***********************************************************************/
    public static void printQueens(int[] q) {
        int N = q.length;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (q[i] == j) System.out.print("Q ");
                else           System.out.print("* ");
            }
            System.out.println();
        }  
        System.out.println();
    }


   /***********************************************************************
    *  Try all permutations using backtracking
    ***********************************************************************/
    public static void enumerate(int N) {
        int[] a = new int[N];
        enumerate(a, 0);
    }

    public static void enumerate(int[] q, int n) {
        int N = q.length;
        if (n == N) printQueens(q);
        else {
            for (int i = 0; i < N; i++) {
                q[n] = i;
                if (isConsistent(q, n)) enumerate(q, n+1);
            }
        }
    }  


    public static void main(String[] args) {
        int N = Integer.parseInt(args[0]);
        enumerate(N);
    }

}

我的问题是:我想知道如何使输出更加精简。换句话说,如何进行输出,以便在每个可能的解决方案的一组括号中列出皇后的行位置?例如,假设我有一个 4x4 板,如下所示:

xxQx
Qxxx
xxxQ
xQxx

我想要的不是上面的输出,而是:(2,4,1,3),其中“2”代表第二行中的皇后(从右到左看的第一个), “4”代表第 4 排的皇后,等等。由于我对编程比较陌生,所以我不太确定如何去做。这是我在代码的 printQueens 部分实际尝试过的:

public static void printQueens(int[] q) {
    int N = q.length;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (q[i] == j)
                int[] rowPos = new int[1+j];
                System.out.print(Arrays.toString(rowPos));

        }

        System.out.println();

    }
    System.out.println();
}

如您所见,在“if”语句下,我创建了一个新数组,希望包含皇后所在的行号,然后我想将其打印为字符串。不过,我在这方面遇到了错误,我不知道为什么。例如,我知道我想要获得的输出不会看起来像 (x,y,z),但我只是想打印此时皇后所在的行,然后担心逗号和括号后面。但是,如果您能帮助我解决这些问题,那就太好了。以下是错误的样子:

编辑:我进行了必要的更改,但现在我的输出如下所示: 1

不确定为什么要根据数组的行数来打印它。每个解决方案我只需要一个输出来显示皇后的行号

【问题讨论】:

  • 您需要在 if 语句之后的行周围加上大括号 {}。您的 System.out.print(Arrays.toString(rowPos)); 已缩进,但它目前不属于 if 块。
  • 哇,那些编译错误具有灾难性的误导性。
  • 您应该开始使用 IDE 以获得更好的错误跟踪。
  • 是的......我认为主要是错误让我失望。

标签: java arrays tostring n-queens


【解决方案1】:
if (q[i] == j)
    int[] rowPos = new int[1+j];
    System.out.print(Arrays.toString(rowPos));

如果这应该是if 块,则需要使用大括号。

if (q[i] == j) {
    int[] rowPos = new int[1+j];
    System.out.print(Arrays.toString(rowPos));
}

但是您的 rowPos 数组将始终保持零,因为您没有在其中放入任何内容。

编辑:

如果您只想打印q 的内容,这似乎就是您所说的,您可以摆脱循环并执行以下操作:

public static void printQueens(int[] q) {
    System.out.println(Arrays.toString(q));
}

如果您需要打印位置,就好像它们是从 1 而不是从 0 索引的一样,您可以这样做:

public static void printQueens(int[] q) {
    int[] adjusted = new int[q.length];
    for (int i = 0; i < q.length; ++i) {
         adjusted[i] = q[i] + 1;
    }
    System.out.println(Arrays.toString(adjusted));
}

【讨论】:

  • 谢谢。您能否详细说明最后一部分?我如何才能用特定皇后区的行号实际替换这些零?
  • 我会尝试,但我不完全确定我是否满足您的要求。
  • 好的。我想我快到了。我已经编辑了我的答案以显示我的输出,这需要更多的调整。
  • 哦,我明白你的意思了。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多