不同起点的八皇后算法

时间:2016-05-03 10:02:27

标签: java algorithm recursion backtracking

无论起点如何,我都试图找到解决八皇后问题的方法。下面是我的Solver类,但是当我将Queen放在第一行以外的行中时它不能用于某种原因。

import java.util.*; 
public class Queens {
  private static int x;
  private static int y;
  private static ArrayList<Integer> rows = new ArrayList<Integer>();
  public Queens(int index, int row, int pos) {

    for (int i = 0; i<index; i++)
      rows.add(i);
    rows.remove(row);
    x = pos;
    y = row;
  }

public static boolean solve(int row, int[][] board, int N, int pos) {
    board[y][x] = 1;
    System.out.println("row: " + row);
    for(int i = 0; i < 8; i++) {
      for(int j = 0; j < 8; j++) {
        if(board[i][j]==1) System.out.print("Q ");
        else System.out.print("* ");
      }
      System.out.println();
    }
    System.out.println();    
    if(row>=N-1) return true;
    for(int position = pos; position < N; position++) {
      if(isValid(board, rows.get(row), position, N)) {
        board[rows.get(row)][position] = 1;
        if(!solve(row+1, board, N, 0)) {
          board[rows.get(row)][position] = 0;
        } else
          return true;
      }
    }
    return false;
  }

  public static boolean isValid(int[][] board, int y, int x, int N) {
    int i, j;
    for(i = 0; i < y; i++)
      if(board[i][x]==1)
        return false;
    i = y - 1;
    j = x - 1;
    while((i>=0)&&(j>=0))
      if(board[i--][j--]==1) return false;
    i = y - 1;
    j = x + 1;
    while((i>=0)&&(j<N))
      if(board[i--][j++]==1) return false;
    return true;
  }
}

例如,当我把初始女王放在船上[2] [2]时,这就是我得到的解决方案:

Q * * * * * * * 
* * Q * * * * * 
* * Q * * * * * 
* * * * * Q * * 
* * * * * * * Q 
* Q * * * * * * 
* * * Q * * * * 
* * * * * * Q * 

代码有什么问题?为什么忽视最初的作品?提前谢谢。

1 个答案:

答案 0 :(得分:1)

isValid中for循环的界限是什么?他们是否阻止你将女王放入下面还有另一位女王的专栏?

类似的问题也适用于while循环 - 他们是否可以检测到对角线上有一个女王但低于你现在正在放置的那个?