2014-10-11 2 views
-2
public class SomeQueens { 

static Stack<Integer> s= new Stack<Integer>(); 
static int Solved = 0; 
static int current = 0; 


public static int solve(int n) { // n is 8 

    while(current < n) { // should I use current < n instead 

    for (int i = current; i < n; i++) { 
     if(validPosition(i)) { 
      s.push(i); 
      current = 0; 
     } 
    } 

    if(!validPosition(current)) { 
     if(s.empty()) { 
      break; 
     } 
     if(!s.empty()) { 
      s.pop(); 
      current++; 
} 
} 

if(s.size() == n) { 
     s.pop(); 
     current++; 
     printSolution(s);// this is a method, but it shouldn't matter for this 
     Solved++; 
    } 
    } 
    return Solved; 
    } 
public static boolean validPosition(int column) { 
    for(int row = 0; row < s.size(); row++) 
     if(s.get(row) == column || ((column - s.get(row)) == (s.size() - row)) || 
     ((s.get(row) - column) == (s.size() - row))) 
     return false; // there's a conflict 
    return true; // no conflict;  
} 

//it's called by int num = solve(n); 
//sop("There're" + num + "sols to the" + n "queens prob"); 

Это подразделение моей программы для NQueens, но я, кажется, всегда получаю: Есть 0 решений проблемы 8-queens. Я пробовал отлаживать с помощью system.out.prints в основном методе, что заставило меня предположить, что в моем логическом методе что-то не так, но я не думаю, что он делает что-то неправильно. Я не уверен, что мой оператор while неверен или если прерывание внутри цикла while инициализировано, прежде чем что-либо будет сделано. Спасибо за помощь и руководство, и я сожалею, если моя программа и объяснения не имеет смыслаПолучение каждой комбинации Queens?

+0

Почему не использовать рекурсивный? – user3437460

+0

Кажется, нет оператора return для 'int solve (int n)'. Это не должно компилироваться. – Dawnkeeper

+0

Я не могу использовать рекурсивный и извиняюсь за то, что не разместил это - теперь я это сделал. Извините за то, что я не прояснил ситуацию. – ExchangeChri

ответ

1

Вот почему вы сразу получаете ноль:

s.push(0); 
while(s.size() > n) // n is 8 
{ 
//... 
} 
return Solved; 

Когда программа прибывает в то время как-условие s имеет размер одного и n равен 8. Это мгновенно выйдет из строя и вызовет метод возврата нуля.

Но это не единственная проблема с алгоритмом. Вы должны серьезно пересмотреть это.

+0

Я принял вашу критику и переписал ее – ExchangeChri