Cod sursa(job #2626913)

Utilizator DoozCristian Bacaoanu Dooz Data 9 iunie 2020 00:59:32
Problema Problema Damelor Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <stdio.h>


int result[5000][5000];
int n = 13;
int solutie[13];
int nrsol = 0;

void bk(int k);
int check(int k);
int abs(int x) {
	return x < 0 ? x*-1 : x;
}

void bk(int k) {
	int i, p, l, m, repeat;

	for(i=0; i<n*n; i++) {
		solutie[k] = i;

		if(k+1 == n) {
			if(check(k)) {
				for(p=0; p<nrsol; p++) {
					repeat = 0;
					for(l=0; l<n; l++) {
						for(m=0; m<n; m++) {
							if(solutie[m] == result[p][l]) repeat ++;
						}
					}
					if(repeat == n) goto brk;
				}

				brk:
				if(repeat < n) {
					for(p=0; p<n; p++) result[nrsol][p] = solutie[p];
					nrsol++;
					printf("S-a gasit solutia %d\n", nrsol);

				}
			}
		}

		else {
			bk(k+1);
		}

	}

}

int check(int k) {
	int linek, colk, poz, linei, coli;
	poz = solutie[k];
	linek = 0;
	colk = 0;
	while(poz >= n) {
		poz -= n;
		linek++;
	}
	colk = poz;
	for(int i = 0; i <= k-1; i++) {
		poz = solutie[i];
		linei = 0;
		coli = 0;
		while(poz >= n) {
			poz -= n;
			linei++;
		}

		coli = poz;
		if((abs(linek-linei) == abs(colk-coli)) || linek == linei || colk == coli || solutie[k] == solutie[i]) {
			return 0;
		}
	}


	return 1;
}

int main() {
	int i, k;

	bk(0);

//	for(i = 0; i<nrsol; i++) {
//		for(k = 0; k<n; k++) printf("%d ", result[i][k]);
//
//		printf("\n");
//	}
//	printf("%d", nrsol);

	return 0;
}