2017-06-27 4 views
1

Ich weiß, es ist eine sehr einfache Frage, und ich bin neu zu programmieren, Es Brüder mich für ein paar Stunden .. Folgendes ist mein Code, ich weiß wirklich nicht warum Grafen doesn; t ändert sich die FunktionWarum der Wert für die Zählung ändert sich nicht

public class Solution { 
    public int totalNQueens(int n) { 
     int count =4; 
     boolean[] col = new boolean[n]; 
     boolean[] dia1 = new boolean[2*n]; 
     boolean[] dia2 = new boolean[2*n]; 
     backtrack(0, col, dia1, dia2,count,n); 
     return count; 
    } 

    private void backtrack(int rownum, boolean[] col, boolean[] dia1, boolean[] dia2, int count,int n){ 
     count =5; 
     if(rownum==n){ 
      count++; 
     }else{ 
      for(int i=0; i<n;i++){ 
       int index1 = i-rownum+n; 
       int index2 = i+rownum; 
       if(col[i]||dia1[index1]||dia2[index2]) continue; 
       col[i]=true; dia1[index1]=true; dia2[index2]=true; 
       backtrack(rownum+1, col,dia1,dia2,count,n); 
       col[i]=false; dia1[index1]=false; dia2[index2]=false; 
      } 
     } 
    } 
} 

Antwort

0

Weil in Ihrer totalNQueens Funktion geht, setzen Sie bis 4 zählen ... Und Sie es dann zurück. Sobald Sie die Backtrack-Funktion aufrufen, ist es eine "andere" Anzahl, die die Zählvariable in totalNQueens nicht ändert. Es gibt mehrere Möglichkeiten, es zu lösen, am einfachsten ist es, wenn Sie Ihre Backtrack-Methode zu einer Funktion machen, die am Ende "count" zurückgibt. Oder Sie könnten eine Klassenvariable zählen.

Edit: Ich sollte verweisen Sie auf "Umfang der Variablen."

Edit 2: Versuchen Sie diese statt:

public class Solution { 
    public int totalNQueens(int n) { 
     int count =4; 
     boolean[] col = new boolean[n]; 
     boolean[] dia1 = new boolean[2*n]; 
     boolean[] dia2 = new boolean[2*n]; 
     return backtrack(0, col, dia1, dia2,count,n); 
    } 

    private int backtrack(int rownum, boolean[] col, boolean[] dia1, boolean[] dia2, int count,int n){ 
     if(rownum==n){ 
      count++; 
     }else{ 
      for(int i=0; i<n;i++){ 
       int index1 = i-rownum+n; 
       int index2 = i+rownum; 
       if(col[i]||dia1[index1]||dia2[index2]) continue; 
       col[i]=true; dia1[index1]=true; dia2[index2]=true; 
       count = backtrack(rownum+1, col,dia1,dia2,count,n); 
       col[i]=false; dia1[index1]=false; dia2[index2]=false; 
      } 
     } 
     return count; 
    } 
} 

einige Probleme gibt es hier, though. Sie verwenden Rekursion. Ich denke, dass Ihr Code nicht das tut, was Sie wollen, weil Sie count = 5 als erste Zeile von "backtrack" setzen. Ich nehme an, das ist für Debugging-Zwecke, nur um zu sehen, dass es Ihren Rückgabewert ändert, aber natürlich betraf es nur die "Instanz" von "count" im Backtrack und nicht totalNQueens. Also habe ich es entfernt, weil ich nicht glaube, dass es tatsächlich Teil Ihres Algorithmus ist. Es kann auch falsch sein, die Zählung an der Stelle einzustellen, an der ich es in der Backtrack-Funktion eingestellt habe ... Ich kenne Ihren Algorithmus nicht (obwohl ich das Problem, das Sie lösen, erraten kann).

Noch einmal, ich flehe Sie an, "Variable Scope."

+0

Vielen Dank für Ihre Erklärung, aber ich verstehe immer noch nicht, warum die Zählung im totalNQueens eine andere Variable ist als die Zählung, die ich am Anfang erklärt habe ... – ztcdsb

+0

Ich denke, ich verstehe nicht genau wo Sie sagen, dass sich der Count nicht ändert. Wenn Sie nur den Rückgabewert von totalNQueens betrachten, sieht es aus, als wäre es wegen des variablen Bereichs immer 4. Oder sagst du, dass sich in "Backtrack" nicht zu 5 oder 6 (die erste Iteration) ändert? Denn woher weißt du das, wenn du nicht gerade einen Debugger durchsuchst oder den Wert irgendwo druckst, dann gibst du uns nicht den ganzen Code. – Fhaab

+0

Ich sage jedoch, dass, egal was Sie an totalNQueens übergeben, es immer 4 zurückgibt. Sie deklarieren eine neue und andere Variable namens "count" in Ihrer Backtrack-Funktion. – Fhaab

Verwandte Themen