Tags

  • AWS (8)
  • Apigee (3)
  • ArchLinux (5)
  • Array (6)
  • Backtracking (6)
  • BinarySearch (6)
  • C++ (19)
  • CI&CD (3)
  • Calculus (2)
  • Database (1)
  • DesignPattern (43)
  • DisasterRecovery (1)
  • Docker (8)
  • DynamicProgramming (20)
  • FileSystem (11)
  • Frontend (2)
  • FunctionalProgramming (1)
  • GCP (1)
  • Gentoo (6)
  • Git (16)
  • Golang (1)
  • Graph (10)
  • GraphQL (1)
  • Hardware (1)
  • Hash (1)
  • Kafka (1)
  • LinkedList (13)
  • Linux (27)
  • Lodash (2)
  • MacOS (3)
  • Makefile (1)
  • Map (5)
  • Miscellaneous (1)
  • MySQL (21)
  • Neovim (11)
  • Network (72)
  • Nginx (6)
  • Node.js (33)
  • OpenGL (6)
  • PriorityQueue (1)
  • ProgrammingLanguage (9)
  • Python (10)
  • RealAnalysis (20)
  • Recursion (3)
  • Redis (1)
  • RegularExpression (1)
  • Ruby (19)
  • SQLite (1)
  • Sentry (3)
  • Set (4)
  • Shell (4)
  • SoftwareEngineering (12)
  • Sorting (2)
  • Stack (4)
  • String (2)
  • SystemDesign (13)
  • Terraform (2)
  • Tree (24)
  • Trie (2)
  • TwoPointers (16)
  • TypeScript (3)
  • Ubuntu (4)
  • Home

    N Queen Problem

    Published Sep 30, 2019 [ ]

    The N Queen Problem is the problem of placing N chess queens on an NxN chessboard so that no two queens attack each other.

    Code

    #include <iostream>
    #include <vector>
    #include <chrono>
    
    #define N 8
    
    using namespace std;
    
    void printSol(vector<vector<int>>& sol) {
    	for (auto row : sol) {
    		for (auto data : row) {
    			cout << data << " ";
    		}
    		cout << endl;
    	}
    	cout << endl;
    }
    
    bool validQueen(vector<vector<int>>& sol, int row, int col) {
    
    	for (auto i = 0; i < col; i++) {
    		if (sol[row][i]) {
    			return false;
    		}
    	}
    
    	for (auto i = row, j = col; i >= 0 && j >= 0; i--, j--) {
    		if (sol[i][j]) {
    			return false;
    		}
    	}
    
    	for (auto i = row, j = col; i < N && j >= 0; i++, j--) {
    		if (sol[i][j]) {
    			return false;
    		}
    	}
    
    	return true;
    }
    
    bool solveNQHelper(vector<vector<int>>& sol, int col) {
    	if (col >= N) {
    		return true;
    	}
    
    	for (auto row = 0; row < N; row++) {
    		if (validQueen(sol, row, col)) {
    			sol[row][col] = 1;
    			if (solveNQHelper(sol, col + 1)) {
    				return true;
    			}
    			else {
    				sol[row][col] = 0;
    			}
    		}
    	}
    
    	return false;
    }
    
    void solveNQ() {
    	// initialize the solution as 
    	vector<vector<int>> sol(N, vector<int>(N, 0));
    
    	if (solveNQHelper(sol, 0)) {
    		printSol(sol);
    	}
    	else {
    		cout << "There is no answer for N Queen Problem with N = " << N << endl;
    	}
    }
    
    int main() {
    	auto start = chrono::steady_clock::now();
    	solveNQ();
    	auto end = chrono::steady_clock::now();
    	auto diff = end - start;
    	cout << "Total execuation time ";
    	cout << chrono::duration<double, milli>(diff).count() << " ms" << endl;
    	return 0;
    }
    
    

    References