2015-10-29 2 views
1

Функция NQueens isSafeMove() постоянно возвращает false, и я не могу понять, почему. Я считаю, что это может иметь какое-то отношение к моему checkLeft, checkUpperDiag или checkLowerDiag, но я не вижу в них ничего плохого. Функция isSafeMove проверяет, является ли это кусок на любом перемещаемом расстоянии от королевы, если есть ложь возврата, если нет, тогда он должен вернуть true.My NQueens isSafeMove() функция постоянно возвращается false

import java.awt.Point; 
public class NQueensModel 
{ 
    private int myNumQueens; 
    private boolean myBoard[][]; 
    private boolean mySolutionBoard [][]; 
    private String mySolutionBoardString [][]; 
    private int myNumSolutions; 


NQueensModel(int nQueens) 
{ 
    myNumQueens = nQueens; 
    myBoard = new boolean [myNumQueens][myNumQueens]; 
    mySolutionBoard = new boolean [myNumQueens][myNumQueens]; 
    mySolutionBoardString = new String [myNumQueens][myNumQueens]; 
} 

public boolean solvePuzzle() 
{ 
    return solvePuzzle(0); 
} 

private boolean solvePuzzle(int ncolumn) 
{ 
    if (ncolumn >= myNumQueens) 
    { 
     return true; 
    } 
    for(int i = 0; i < myNumQueens; i++) 
    { 
     if(this.isSafeMove(i, ncolumn) == true) 
     { 
      this.placeQueen(i, ncolumn); 
      if(this.solvePuzzle(ncolumn + 1) == true) 
      { 
       return true; 
      } 
      this.removeQueen(i, ncolumn); 
     } 
    } 
    return false; 
} 

public boolean isSafeMove(int row, int col) 
{ 
    if(this.checkLeft(row, col) || this.checkUpperDiag(row, col) 
      || this.checkLowerDiag(row, col) == true) 
    { 
     System.out.println("false"); 
     return false; 
    } 

    else 
    { 
     System.out.println("true"); 
     return true; 
    } 
} 

private boolean checkLeft(int row, int col) 
{ 

    if(col >= myNumQueens || row >= myNumQueens) 
    { 
     return false; 
    } 
    if(row == 0) 
    { 
     return true; 
    } 
    for(int i= col - 1 ; i >= 0; i--) 
    { 
     if(myBoard[row][i] == true) 
     { 
      return false; 
     } 
     if(i == 0) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

private boolean checkUpperDiag(int row, int col) 
{ 
    if(col == 0 || row == 0) 
    { 
     return true; 
    } 
    for(int i = row, j = col; row >= 0 || col >= 0; row--, col--) 
    { 
     if(myBoard[row][col] == true) 
     { 
      return false; 
     } 
     if(col == 0 && row == 0) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

private boolean checkLowerDiag(int row, int col) 
{ 
    if(col == 0 || row == myNumQueens - 1) 
    { 
     return true; 
    } 
    for(int i = row, j = col; row < myNumQueens || col < myNumQueens; row--, col++) 
    { 
     if(myBoard[row][col] == true) 
     { 
      return false; 
     } 
     if(col == 0 && row == myNumQueens - 1) 
     { 
      return true; 
     } 
    } 

    return false; 
} 



public boolean placeQueen(int row, int col) 
{ 
    if(myBoard[row][col] == false) 
    { 
     myBoard[row][col] = true; 
     return false; 
    } 
    return false; 
} 


public String getMySolutionBoardString() 
{ 
    for(int col = 0; col < myNumQueens; col++) 
    { 
     for(int row = 0; row < myNumQueens; row++) 
     { 
      if(myBoard[col][row] == true) 
      { 
       mySolutionBoardString[row][col] = "Q"; 
      } 
      else 
      { 
       mySolutionBoardString[row][col] = "-"; 
      } 
      System.out.print(mySolutionBoardString[row][col] + " "); 
     } 
     System.out.println(""); 
    } 
    return null; 
} 

private boolean removeQueen(int row, int col) 
{ 
    myBoard[row][col] = false; 
    return false; 
} 

public boolean getQueenOnBoard(Point point) 
{ 
    return myBoard[(int)point.getX()][(int)point.getY()]; 
} 

public String toString() 
{ 
    String string = this.getMySolutionBoardString(); 
    return string; 
} 

}

+1

Что произойдет, когда вы запустить этот код с помощью отладчика (у большинства современных Java IDE есть возможности отладчика)? –

+0

@HovercraftFullOfEels да после того, как он проходит через checkLeft, он даже не потрудился пройти через любую другую проверку. –

ответ

0

В вашем цикле

for(int i = 0; i < myNumQueens; i++) 
{ 
    if(this.isSafeMove(i, ncolumn) == true) 
    { 
     this.placeQueen(i, ncolumn); 
     if(this.solvePuzzle(ncolumn + 1) == true) 
     { 
      return true; 
     } 
     this.removeQueen(i, ncolumn); 
    } 
} 

Подумайте об этом, когда вы звоните isSafeMove (я, ncolumn) в первый раз, я = 0, так checkLeft возвращает истину, и все итерации после этого ncolumn = 0, поэтому ваши вызовы checkUpperDiag() и checkLowerDiag() вернут true, поэтому методы, возвращающие true каждый раз, означают isSafeMove вернет false каждую итерацию вашего цикла

+0

Я решил исправить свою проблему. У меня есть еще один вопрос: как бы я распечатал количество решений для каждой проблемы nQueens. например, поскольку 8x8 имеет 92 решения, которые я распечатал, 8-nQueens: 92 решения. –

+0

Я не знаю, используйте метод toString, я думаю, вы должны просто задать другой вопрос, если у вас есть один – JRowan

Смежные вопросы