(KOR) N-Queen

Published by

on

Problem – ⭐️⭐️⭐️⭐️⭐️

Solution

import java.util.*;

public class Main{
    static int n, res;
    static boolean[][] matrix;

    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        res = 0;
        matrix = new boolean[n][n];

        Main myMain = new Main();
        myMain.solve(0, 0);
        System.out.println(res);
    }
    
    // Each row can only have 1 Queen, so pass 'row' as an argument and check that row only
    private void solve(int queenCnt, int row){
        if(queenCnt == n){
            res++;
            return;
        }

        for(int j=0;j<n;j++){
            if(isPlaceable(row, j)){
                matrix[row][j] = true;
                queenCnt++;
                
                solve(queenCnt, row+1);
                
                // Backtracking
                matrix[row][j] = false;
                queenCnt--;
            }
        }
    }

    private boolean isPlaceable(int x, int y){
        for(int i=0;i<n;i++){
            if(matrix[i][y])    // Column
                return false;

            if(matrix[x][i])    // Row
                return false;

            if((x-i >= 0) && (y+i) < n){ // Upper right
                if(matrix[x-i][y+i])
                    return false;
            }
            if((x-i >= 0) && (y-i) >= 0){ // Upper left
                if(matrix[x-i][y-i])
                    return false;
            }
            if((x+i < n) && (y+i) < n){ // Lower right
                if(matrix[x+i][y+i])
                    return false;
            }
            if((x+i < n ) && (y-i) >= 0){ // Lower left
                if(matrix[x+i][y-i])
                    return false;
            }
        }

        return true;
    }
}

Key Points

  • The solve method did not require nested for loops like
    for(int i=0;..){
    for(int j=0..){.
    Instead, we could just pass ‘row’ as an argument and check that row only, because each row can only have 1 Queen at maximum.

Leave a comment

Previous Post
Next Post