2012-01-12 3 views
0

質問は私のプログラムが何とかnをn-1に変更するときです。 私のコードのどの行が起こっているか教えてください。 例:BOOLでクイーンバックトラック(n変更)

  1. 22ステップ0 2 4 1 3 6 0 0 N - BOOLで> 5 N - > 5 I = 7 N - > 5
  2. 23ステップ0 2 4 1 3 7 0 boolの0 n - boolの5 n - > 5 nのbool - > 5 i = 4 n - > 4
  3. 24ステップ0 2 4 1 4 7 0 0 n in bool - > 4 i = 5 n - > 4

我々は、私はステップ22で持ってN = 5でわかるように、ステップ23においてIは、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); 

    } 
} 
+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 -> 5N回を印刷するには:それは中です。しかし5のの間、これらのNプリントアウトして、numeravimas(q, 6)はあなたがi上でforループの組み合わせからnの様々な値の一部織りを取得し、numeravimasの再帰呼び出しますので、それ自体が... numeravimas(q, 7)を呼び出す、と呼ばれています。

関連する問題