Pagini recente » Cod sursa (job #1670247) | Cod sursa (job #436803) | Cod sursa (job #674085) | Cod sursa (job #2530980) | Cod sursa (job #1991558)
#include <iostream>
#include <fstream>
#include <unordered_map>
using namespace std;
ifstream in("damesah.in");
ofstream out("damesah.out");
#define ll long long
#define pb push_back
const int inf = 1e9 + 5;
const int NMax = 30 + 5;
int N,nrSol;
bool ans;
int a[NMax][NMax];
void backT(int,int);
bool checkDiag1(int,int);
bool checkDiag2(int,int);
bool checkRow(int);
bool checkCol(int);
int main() {
in>>N;
backT(1,1);
out<<'\n'<<nrSol<<'\n';
in.close();out.close();
return 0;
}
void backT(int nr,int x) {
if (nr == N + 1) {
if (!ans) {
ans = true;
for (int i=1;i <= N;++i) {
for (int j=1;j <= N;++j) {
if (a[i][j]) {
out<<j<<' ';
break;
}
}
}
}
++nrSol;
return;
}
for (int i=x;i <= N;++i) {
for (int j=1;j <= N;++j) {
if (checkDiag1(i,j) && checkDiag2(i,j) &&
checkRow(i) && checkCol(j)) {
a[i][j] = 1;
backT(nr+1,i+1);
a[i][j] = 0;
}
}
}
}
bool checkDiag1(int x,int y) {
int i,j;
i = x; j = y;
while (i && j) {
if (a[i][j]) {
return false;
}
--i; --j;
}
i = x; j = y;
while (i <= N && j <= N) {
if (a[i][j]) {
return false;
}
++i; ++j;
}
return true;
}
bool checkDiag2(int x,int y) {
int i,j;
i = x; j = y;
while (i <= N && j) {
if (a[i][j]) {
return false;
}
++i; --j;
}
i = x; j = y;
while (i && j <= N) {
if (a[i][j]) {
return false;
}
--i; ++j;
}
return true;
}
bool checkRow(int x) {
for (int j=1;j <= N;++j) {
if (a[x][j]) {
return false;
}
}
return true;
}
bool checkCol(int y) {
for (int i=1;i <= N;++i) {
if (a[i][y]) {
return false;
}
}
return true;
}