#include<iostream>
using namespace std;
bool isSafe(int board[][10], int i, int j, int n){
//you can check for column
for(int row=0;row<i;row++){
if(board[row][j]==1){
return false;
}
}
//you can check for left diagonl
int x = i;
int y = j;
while(x>=0 && y>=0)
{
if(board[x][y]==1){
return false;
}
x--;
y--;
}
//you can check for right diagonal
x = i;
y = j;
while(x>=0 && y<n)
{
if(board[x][y]==1){
return false;
}
x--;
y++;
}
//the position is now safe, column and diagonals
return true;
}
bool solveNQueen(int board[][10],int i, int n){
//base case
if(i==n){
//you hav successfully place queens in n rows( 0,....,n-1);
//print the board;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(board[i][j]==1){
cout<<"Q";
}
else{
cout<<"_ ";
}
}
cout<<endl;
}
return true;
}
//rec case
//try to place the queen in the current row and call on the remaining mart which will b done by recursion
for(int j=0;j<n;j++){
//i hav to check if i,j th position is safe to place the queen or not
if(isSafe(board,i,j,n)){
//place the queen - assuming i,j is the correct position
board[i][j]=1;
bool nextQueenRakhPaye = solveNQueen(board,i+1,n);
if(nextQueenRakhPaye){
return true;
}
//means i,j if not the correct position - Assumption is wrong
board[i][j]=0;//backtrack
}
}
//you hav tried all positions in a current row but couldn't place the queen
return true;
}
int main(){
int n;
cin>>n;
int board[10][10] = {0};
solveNQueen(board,0,n);
return 0;}
I2luY2x1ZGU8aW9zdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpib29sIGlzU2FmZShpbnQgYm9hcmRbXVsxMF0sIGludCBpLCBpbnQgaiwgaW50IG4pewogICAgLy95b3UgY2FuIGNoZWNrIGZvciBjb2x1bW4KICAgIGZvcihpbnQgcm93PTA7cm93PGk7cm93KyspewogICAgICAgIGlmKGJvYXJkW3Jvd11bal09PTEpewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8veW91IGNhbiBjaGVjayBmb3IgbGVmdCBkaWFnb25sCiAgICBpbnQgeCA9IGk7CiAgICBpbnQgeSA9IGo7CiAgICB3aGlsZSh4Pj0wICYmIHk+PTApCiAgICB7CiAgICAgICAgaWYoYm9hcmRbeF1beV09PTEpewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgeC0tOwogICAgICAgeS0tOwogICAgfQoKICAgIC8veW91IGNhbiBjaGVjayBmb3IgcmlnaHQgZGlhZ29uYWwKICAgIHggPSBpOwogICAgeSA9IGo7CiAgICB3aGlsZSh4Pj0wICYmIHk8bikKICAgIHsKICAgICAgICBpZihib2FyZFt4XVt5XT09MSl7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICB4LS07CiAgICAgICB5Kys7CiAgICB9CiAgICAvL3RoZSBwb3NpdGlvbiBpcyBub3cgc2FmZSwgY29sdW1uIGFuZCBkaWFnb25hbHMKICAgIHJldHVybiB0cnVlOwp9CmJvb2wgc29sdmVOUXVlZW4oaW50IGJvYXJkW11bMTBdLGludCBpLCBpbnQgbil7CiAgICAvL2Jhc2UgY2FzZQogICAgaWYoaT09bil7CiAgICAgICAgLy95b3UgaGF2IHN1Y2Nlc3NmdWxseSBwbGFjZSBxdWVlbnMgaW4gbiByb3dzKCAwLC4uLi4sbi0xKTsKICAgICAgICAvL3ByaW50IHRoZSBib2FyZDsKICAgICAgICBmb3IoaW50IGk9MDtpPG47aSsrKXsKICAgICAgICAgICAgZm9yKGludCBqPTA7ajxuO2orKyl7CiAgICAgICAgICAgICAgICBpZihib2FyZFtpXVtqXT09MSl7CiAgICAgICAgICAgICAgICAgICAgY291dDw8IlEiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICBjb3V0PDwiXyAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvdXQ8PGVuZGw7CiAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8vcmVjIGNhc2UKICAgIC8vdHJ5IHRvIHBsYWNlIHRoZSBxdWVlbiBpbiB0aGUgY3VycmVudCByb3cgYW5kIGNhbGwgb24gdGhlIHJlbWFpbmluZyBtYXJ0IHdoaWNoIHdpbGwgYiBkb25lIGJ5IHJlY3Vyc2lvbgogICAgZm9yKGludCBqPTA7ajxuO2orKyl7CiAgICAgICAgLy9pIGhhdiB0byBjaGVjayBpZiBpLGogdGggcG9zaXRpb24gaXMgc2FmZSB0byBwbGFjZSB0aGUgIHF1ZWVuIG9yIG5vdAogICAgICAgIGlmKGlzU2FmZShib2FyZCxpLGosbikpewogICAgICAgICAgICAvL3BsYWNlIHRoZSBxdWVlbiAtIGFzc3VtaW5nIGksaiBpcyB0aGUgY29ycmVjdCBwb3NpdGlvbgogICAgICAgICAgICBib2FyZFtpXVtqXT0xOwoKICAgICAgICAgICAgYm9vbCBuZXh0UXVlZW5SYWtoUGF5ZSA9IHNvbHZlTlF1ZWVuKGJvYXJkLGkrMSxuKTsKICAgICAgICAgICAgaWYobmV4dFF1ZWVuUmFraFBheWUpewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAvL21lYW5zIGksaiBpZiBub3QgdGhlIGNvcnJlY3QgcG9zaXRpb24gLSBBc3N1bXB0aW9uIGlzIHdyb25nCiAgICAgICAgICAgYm9hcmRbaV1bal09MDsvL2JhY2t0cmFjawogICAgICAgIH0KICAgIH0KICAgIC8veW91IGhhdiB0cmllZCBhbGwgcG9zaXRpb25zIGluIGEgY3VycmVudCByb3cgYnV0IGNvdWxkbid0IHBsYWNlIHRoZSBxdWVlbgogICAgcmV0dXJuIHRydWU7Cn0KCmludCBtYWluKCl7CiAgICBpbnQgbjsKICAgIGNpbj4+bjsKICAgIGludCBib2FyZFsxMF1bMTBdID0gezB9OwoKICAgIHNvbHZlTlF1ZWVuKGJvYXJkLDAsbik7CnJldHVybiAwO30K