LeetCode - N-Queens | Darren's Blog



The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Recursive Version:
public ArrayList<String[]> solveNQueens(int n) {
        ArrayList<String[]> result = new ArrayList<String[]>();
        recursiveNQueens(n, 0, new int[n], result);
        return result;
    }
 
    // If "currentRow" is n, we have reached a solution based on "queenInColumn",
    // and put it into "result"; Otherwise, we put a queen at each valid column
    // in Row "currentRow", and recursively work on the next row.
    private void recursiveNQueens(int n, int currentRow, int[] queenInColumn,
                                  ArrayList<String[]> result) {
        if (currentRow == n) {      // We have placed n queens
            // Construct a solution based on "queenInColumn"
            String[] solution = new String[n];
            for (int i = 0; i < n; i++) {
                StringBuilder row = new StringBuilder();
                for (int j = 0; j < n; j++) {
                    if (queenInColumn[i] == j)  // There is a queen at Row i and Column j
                        row.append('Q');
                    else
                        row.append('.');
                }
                solution[i] = row.toString();
            }
            // Add the solution to "result"
            result.add(solution);
        } else {
            // Put a queen at each valid column in the current row, and recursively
            // work on the next row
            for (int j = 0; j < n; j++) {
                if (isValid(j, currentRow, queenInColumn)) {
                    // A queen at Column j in the currentRow is valid
                    queenInColumn[currentRow] = j;
                    recursiveNQueens(n, currentRow+1, queenInColumn, result);
                }
            }
        }
    }
 
    // Indicate whether a queen can be put at (workingRow, attemptedColumn)
    // without violating the rules
    private boolean isValid(int attemptedColumn, int workingRow, int[] queenInColumn) {
        // Verify all the rules
        // No row conflict automatically since we put only one queen in each row
        for (int i = 0; i < workingRow; i++) {
            if (attemptedColumn == queenInColumn[i] ||      // No column conflict
                    (workingRow-i == Math.abs(attemptedColumn-queenInColumn[i])))   // No diagnal conflict
                return false;
        }
 
        return true;
    }
Iterative Version from http://blog.csdn.net/kenden23/article/details/18136889
vector<vector<string> > solveNQueens(int n)
{
vector<string> board(n,string(n, '.'));
vector<vector<string> > rs;
int row = 0;
vector<int> backtrackCol(n, -1);
while (row >= 0)
{
int col = 0;
if (backtrackCol[row] != -1)
{
col = backtrackCol[row]+1;
board[row][col-1] = '.';
}
for (; col < n; col++)
{
if (isLegal(board, row, col))
{
board[row][col] = 'Q';
backtrackCol[row] = col;
if (row == n-1)
{
rs.push_back(board);
backtrackCol[row] = -1;
board[row][col] = '.';
row--;
break;
}
row++;
break;
}
}
if (col == n)
{
backtrackCol[row] = -1;
row--;
}
}
return rs;
}
bool isLegal(const vector<string> &board, int row, int col)
{
for (int i = 0; i < row; i++)
{
if (board[i][col] == 'Q') return false;
}
for (int i = row - 1, j = col - 1; i>=0 && j>=0; i--, j--)
{
if (board[i][j] == 'Q') return false;
}
for (int i = row - 1, j = col + 1; i>=0 && j<board.size(); i--, j++)
{
if (board[i][j] == 'Q') return false;
}
return true;
}
Read full article from LeetCode - N-Queens | Darren's Blog

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts