递归拼图解算器不起作用

时间:2016-05-07 18:46:53

标签: java algorithm indexoutofboundsexception solver

我正在研究一款适用于任何尺寸拼图的拼图游戏解算器。我的方法由于某种原因不断抛出index out of bounds exception,我的方法总是说当我调用doesFit()时这件作品不合适。

我已经检查了所有帮助方法,但它们工作正常,但我的解决方案拒绝工作。 (solve方法称为helper,有一个名为remove的辅助方法)

public class Puzzle {

  private Board board;
  private final Piece[] pieces = {new Piece(Side.DIAMOND_OUT, Side.CLUB_OUT, Side.CLUB_IN, Side.DIAMOND_IN), new Piece(Side.CLUB_OUT, Side.HEART_OUT, Side.DIAMOND_IN, Side.CLUB_IN), new Piece(Side.SPADE_OUT, Side.DIAMOND_OUT, Side.SPADE_IN, Side.HEART_IN), new Piece(Side.HEART_OUT, Side.SPADE_OUT, Side.SPADE_IN, Side.CLUB_IN), new Piece(Side.HEART_OUT, Side.DIAMOND_OUT, Side.CLUB_IN, Side.CLUB_IN), new Piece(Side.SPADE_OUT, Side.SPADE_OUT, Side.HEART_IN, Side.CLUB_IN), new Piece(Side.HEART_OUT, Side.DIAMOND_OUT, Side.DIAMOND_IN, Side.HEART_IN), new Piece(Side.SPADE_OUT, Side.DIAMOND_OUT, Side.HEART_IN, Side.DIAMOND_IN), new Piece(Side.CLUB_OUT, Side.HEART_OUT, Side.SPADE_IN, Side.HEART_IN) };
  private ArrayList<Piece> unusedPieces;
  //    ____________________Constructors____________________

  public Puzzle(Board board){
    this.board = board;
  }

  public Puzzle(int width, int height, ArrayList<Piece> a){
    this.board = new Board(height, width);
    unusedPieces = arrayToArrayList(pieces);
    for(int i = 0; i < a.size(); i++){
        pieces[i] = a.get(i);
    }
  }

  public ArrayList<Piece> arrayToArrayList(Piece[] a){
    ArrayList<Piece> al = new ArrayList<Piece>();
    for(int i=0;i<a.length;i++){
        if(a[i] != null)
            al.add(a[i]);
    }
    return al;
  }

  public Piece getPiece(int index){
    return pieces[index];
  }
  public boolean isSolved(){  
    for(int i = 0; i < board.getHeight(); i++){
        for(int j = 0; j < board.getWidth(); j++){
            if(board.isOccupied(i,j) == false) return false;
        }
    }
    return true;
  }
  public void solve(){
    helper(0,0);
  }
  private Piece remove(int row, int col, int index){
    Piece temp = null;
    if(board.isValid(row,col)){
        temp = board.getPiece(row, col);
        board.placePiece(row, col, null);
    }
    unusedPieces.add(index, temp);
    return temp;
  }
  public boolean helper(int row, int col){
    if(this.isSolved() == true) return true;
    int length = unusedPieces.size();
    if(col >= board.getWidth()){
        col = 0;
        row++; 
    }
    for(int i = 0; i < length; i++){
        for(int j = 0; j < 4; j++){
            unusedPieces.get(i).rotateClockwise();
            if(this.doesFit(row,col, unusedPieces.get(i))){
                placePiece(row,col, unusedPieces.get(i));
                if(helper(row, col+1)){
                    return true;
                }
                remove(row, col, i);
            }
        }
    }
    return false;
  }
  public boolean doesFit(int row, int col, Piece piece){ 
    if(board.isOccupied(row, col) == true) return false;
    if(board.isOccupied(row, col-1) && piece.getSides()[Cardinal.WEST.getNumVal()].getNumVal() + board.getPiece(row, col-1).getSides()[Cardinal.EAST.getNumVal()].getNumVal() != 0)return false;
    if(board.isOccupied(row, col+1) && piece.getSides()[Cardinal.EAST.getNumVal()].getNumVal() + board.getPiece(row, col+1).getSides()[Cardinal.WEST.getNumVal()].getNumVal() != 0)return false;            
    if(board.isOccupied(row-1, col) && piece.getSides()[Cardinal.NORTH.getNumVal()].getNumVal() + board.getPiece(row-1, col).getSides()[Cardinal.SOUTH.getNumVal()].getNumVal() != 0)return false;
    if(board.isOccupied(row+1, col) && piece.getSides()[Cardinal.SOUTH.getNumVal()].getNumVal() + board.getPiece(row+1, col).getSides()[Cardinal.NORTH.getNumVal()].getNumVal() != 0)return false;
    return true;
  }
}

0 个答案:

没有答案