8皇后回溯(n改变)

时间:2012-01-12 13:02:47

标签: java

问题是当我的程序回溯它以某种方式将n更改为n-1 你能告诉我我的代码在哪一行发生。 示例:

  1. 22步骤0 2 4 1 3 6 0 0 in bool - >布尔中的5 n - > 5 i = 7 n - > 5
  2. 23步骤0 2 4 1 3 7 0 0 in bool - >布尔中的5 n - >布尔中的5 n - > 5 i = 4 n - > 4
  3. 24步骤0 2 4 1 4 7 0 0 in bool - > 4 i = 5 n - > 4

  4. 我们可以看到在步骤22中我有n = 5,在步骤23中我得到n = 4; 问题:我的代码中的n如何转到n-1?

    来源(代码没有任何错误):

    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.PrintStream;
    import java.util.Arrays;
    
    public class Queens {
    
        public static FileOutputStream Output;
        public static PrintStream file;
        public static int z = 1;
        public static String[] LentosRaides = {"a", "b", "c", "d", "e", "f", "g", "h"};
        public static String[] LentosSkaiciai = {"8", "7", "6", "5", "4", "3", "2", "1"};
    
        /***********************************************************************
         * Grazinam true jei kitu valdoviu padietis q[n] nesikonfliktuoja su kitomis
         * valdovemis q[0] iki q[n-1]
         ***********************************************************************/
        public static boolean arNuoseklus(int[] q, int n) {
            for (int i = 0; i < n; i++) {
                System.out.println("n in bool -> " + n);
    //            System.out.println("i = " +i+ "n = " +n);
    //            System.out.println("q[i] = "+q[i]+" q[n] = "+q[n]);
    //            System.out.print("q[i] - q[n] = ");
    //            System.out.println(q[i] - q[n]);
    //            System.out.print(" q[n] - q[i] = ");
    //            System.out.println(q[n] - q[i]);
    //            System.out.println();
    
    
                if (q[i] == q[n]) {
                    return false;   // tapati skiltis(kolona)
                }
                if ((q[i] - q[n]) == (n - i)) {
                    return false;   // ta pati pagrindine diagonale major
    
                }
                if ((q[n] - q[i]) == (n - i)) {
                    return false;   // ta pati mazesnine diagonale minor
                }
    
            }
            return true;
        }
    
        /***********************************************************************
         * Spausdinimas i tekstini faila: Rezultatai.txt ir i output'a
         ***********************************************************************/
        public static void printQueens(int[] q) {
            int N = q.length;
            String Temp[] = new String[N];
            System.out.println(z);
            for (int y = 0; y < N; y++) {
                Temp[y] = (LentosRaides[q[y]] + LentosSkaiciai[y]);
            }
    
            Arrays.sort(Temp);
            System.out.println(Arrays.asList(Temp));
            file.print(z);
            file.println(Arrays.asList(Temp));
            z++;
    
            for (int j = 0; j < N; j++) {
                System.out.print(q[j] + " ");
            }
    
    //        System.out.println(" ");
    //        System.out.print(" ");
    //
    //        for (int u = 0; u < N; u++) {
    //            System.out.print(" " + LentosRaides[u]);
    //        }
    //
    //        System.out.println();
    //
    //        for (int i = 0; i < N; i++) {
    //            System.out.print(LentosSkaiciai[i] + " ");
    //            for (int j = 0; j < N; j++) {
    //
    //                if (q[i] == j) {
    //                    System.out.print("V ");
    //                } else {
    //                    System.out.print("* ");
    //                }
    //            }
    //
    //            System.out.println();
    //        }
    
    
            System.out.println();
        }
    
        /***********************************************************************
         *  Visu kombinaciju bandimas naudojant "backtracking'a"
         *  numeravimas -> bandimas pastatyti Valdove nuo 0 iki 7 pozicijos
         *  naudojant patikrinima arNuoseklus
         ***********************************************************************/
        public static void numeravimas2(int N) {
            int[] a = new int[N];
            numeravimas(a, 0);
    
        }
    
        public static void numeravimas(int[] q, int n) {
            System.out.println("n -> " + n);
            int N = q.length;
    
            if (n == N) {
                printQueens(q);
              //  System.out.println("o/ ");
    
            } else {
                for (int i = 0; i < N; i++) {
                    q[n] = i;
                    System.out.println(" i =  " + i);
                    System.out.println("n -> " + n);
                    printQueens(q);
                    if (arNuoseklus(q, n)) {
                        numeravimas(q, n + 1);
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            int N = 8;
    
            try {
                Output = new FileOutputStream("Rezultatai.txt");
                file = new PrintStream(Output);
            } catch (Exception e) {
                System.out.println("Neimanoma pasiekti failo");
            }
    
            numeravimas2(N);
    
        }
    }
    

1 个答案:

答案 0 :(得分:2)

它并没有真正减少。它在:

public static void numeravimas(int[] q, int n) {
   ...
        for (int i = 0; i < N; i++) {
            ...
            System.out.println("n -> " + n);
             ...
                numeravimas(q, n + 1);
        }
}

因此,当n = 5时,它会打印n -> 5 N次。但是,在 那些N打印输出5之间,numeravimas(q, 6)被调用,它本身会调用numeravimas(q, 7) ...所以你会得到一些交织的各种值的来自n的for循环和i的递归调用的组合numeravimas