-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path45 Backtrack N Queen.cpp
158 lines (126 loc) · 3.06 KB
/
45 Backtrack N Queen.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/**
Backtracking is nothing extra ordinary .
It is just like plain DFS :)
**/
/** Which of the favors of your Lord will you deny ? **/
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define PII pair<int,int>
#define PLL pair<LL,LL>
#define F first
#define S second
#define ALL(x) (x).begin(), (x).end()
#define READ freopen("alu.txt", "r", stdin)
#define WRITE freopen("vorta.txt", "w", stdout)
#ifndef ONLINE_JUDGE
#define DBG(x) cout << __LINE__ << " says: " << #x << " = " << (x) << endl
#else
#define DBG(x)
#endif
template<class T1, class T2>
ostream &operator <<(ostream &os, pair<T1,T2>&p);
template <class T>
ostream &operator <<(ostream &os, vector<T>&v);
template <class T>
ostream &operator <<(ostream &os, set<T>&v);
inline void optimizeIO()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
}
const int nmax = 2e5+7;
// N x N chessboard
#define N 8
/// Function to check if two queens threaten each other or not
bool isSafe(char mat[][N], int r, int c)
{
/// return false if two queens share the same column
for (int i = 0; i < r; i++)
if (mat[i][c] == 'Q')
return false;
/// return false if two queens share the same \ diagonal
for (int i = r, j = c; i >= 0 && j >= 0; i--, j--)
if (mat[i][j] == 'Q')
return false;
/// return false if two queens share the same / diagonal
for (int i = r, j = c; i >= 0 && j < N; i--, j++)
if (mat[i][j] == 'Q')
return false;
return true;
}
void printBoard(char mat[][N])
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
cout << mat[i][j] << " ";
cout << endl;
}
cout << endl;
}
int cnt = 0;
void nQueen(char mat[][N], int r)
{
/// if N queens are placed successfully, print the solution
if (r == N)
{
cout<<++cnt<<endl;
printBoard(mat);
return;
}
/// place Queen at every square in current row r and recur for each valid movement
for (int i = 0; i < N; i++)
{
/// if no two queens threaten each other
if (isSafe(mat, r, i))
{
/// place queen on current square
mat[r][i] = 'Q';
/// recur for next row
nQueen(mat, r + 1);
/// backtrack and remove queen from current square
mat[r][i] = '-';
}
}
}
int main()
{
optimizeIO();
/// mat[][] keeps track of position of Queens in current configuration
char mat[N][N];
/// initialize mat[][] by '-'
memset(mat, '-', sizeof mat);
nQueen(mat, 0);
return 0;
}
/**
**/
template<class T1, class T2>
ostream &operator <<(ostream &os, pair<T1,T2>&p)
{
os<<"{"<<p.first<<", "<<p.second<<"} ";
return os;
}
template <class T>
ostream &operator <<(ostream &os, vector<T>&v)
{
os<<"[ ";
for(int i=0; i<v.size(); i++)
{
os<<v[i]<<" " ;
}
os<<" ]";
return os;
}
template <class T>
ostream &operator <<(ostream &os, set<T>&v)
{
os<<"[ ";
for(T i:v)
{
os<<i<<" ";
}
os<<" ]";
return os;
}