Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create N Queens.cpp #2905

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 110 additions & 0 deletions N Queens.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
#include <bits/stdc++.h>
using namespace std;

// A utility function to print solution
void printSolution(vector<vector<int>>& board) {
int n = board.size();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
if(board[i][j])
cout << "Q ";
else
cout << ". ";
cout << "\n";
}
}

// A utility function to check if a queen can
// be placed on board[row][col]. Note that this
// function is called when "col" queens are
// already placed in columns from 0 to col -1.
// So we need to check only left side for
// attacking queens
bool isSafe(vector<vector<int>>& board,
int row, int col) {
int n = board.size();
int i, j;

// Check this row on left side
for (i = 0; i < col; i++)
if (board[row][i])
return false;

// Check upper diagonal on left side
for (i = row, j = col; i >= 0 &&
j >= 0; i--, j--)
if (board[i][j])
return false;

// Check lower diagonal on left side
for (i = row, j = col; j >= 0 &&
i < n; i++, j--)
if (board[i][j])
return false;

return true;
}

// A recursive utility function to solve N
// Queen problem
bool solveNQUtil(vector<vector<int>>& board, int col) {
int n = board.size();

// base case: If all queens are placed
// then return true
if (col >= n)
return true;

// Consider this column and try placing
// this queen in all rows one by one
for (int i = 0; i < n; i++) {

// Check if the queen can be placed on
// board[i][col]
if (isSafe(board, i, col)) {

// Place this queen in board[i][col]
board[i][col] = 1;

// recur to place rest of the queens
if (solveNQUtil(board, col + 1))
return true;

// If placing queen in board[i][col]
// doesn't lead to a solution, then
// remove queen from board[i][col]
board[i][col] = 0; // BACKTRACK
}
}

// If the queen cannot be placed in any row in
// this column col then return false
return false;
}

// This function solves the N Queen problem using
// Backtracking. It mainly uses solveNQUtil() to
// solve the problem. It returns false if queens
// cannot be placed, otherwise, return true and
// prints placement of queens in the form of 1s.
// Please note that there may be more than one
// solutions, this function prints one of the
// feasible solutions.
bool solveNQ(int n) {
vector<vector<int>> board(n, vector<int>(n, 0));

if (solveNQUtil(board, 0) == false) {
cout << "Solution does not exist";
return false;
}

printSolution(board);
return true;
}

// Driver program to test above function
int main() {
int n = 4;
solveNQ(n);
return 0;
}