Cod sursa(job #2644797)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 25 august 2020 22:55:19
Problema Problema Damelor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <cstdio>
#include <vector>

using namespace std;

bool is_valid(int n, int x, int y, vector<bool> &diags1, vector<bool> &diags2, vector<bool> &columns)
{
	if (columns[y] == true || diags1[n + x-y] == true || diags2[x+y] == true)
        return false;
	return true;
}


void backt(int n, int curr_step, int &solutionsno, vector<int> & ys, vector<int> & sols,
           vector<bool> &diags1, vector<bool> &diags2, vector<bool> &columns)
{
	if (curr_step == n+1) {
		if(sols.size() == 0)
			sols.assign(ys.begin(), ys.end());
		++solutionsno;
		return;
	}

	for (int i=1; i<=n; ++i)
		if (is_valid(n, curr_step, i, diags1, diags2, columns)) {
            diags1[n + curr_step - i] = true;
            diags2[curr_step + i] = true;
            columns[i] = true;

			ys.push_back(i);
			backt(n, curr_step + 1, solutionsno, ys, sols, diags1, diags2, columns);
			ys.pop_back();

            diags1[n + curr_step - i] = false;
            diags2[curr_step + i] = false;
            columns[i] = false;
		}
}



int main() {
	freopen("damesah.in", "r", stdin);
	freopen("damesah.out", "w", stdout);

	int n, solutionsno = 0;
	scanf("%d", &n);

	vector<bool> columns(n+1);
	vector<bool> diags1(2*n);
	vector<bool> diags2(2*n);
	vector<int> solutions;
	vector<int> ys;
	ys.push_back(0);

	backt(n, 1, solutionsno, ys, solutions, diags1, diags2, columns);

	for(int i=1; i<solutions.size(); ++i) {
		printf("%d ", solutions[i]);
	}

	printf("\n%d\n", solutionsno);
	return 0;
}