Problema das 8 rainhas
Enunciado
Neste puzzle clássico você deverá dispor 8 rainhas no tabuleiro de modo que nenhuma fique sob "ataque" de outra. Há um total de 92 soluções possíveis e 12 distintas(descontadas as soluções simétricas de rotação e reflexão).
Implementação
#include <stdio.h> //biblioteca standard input/output
#include <stdlib.h> //biblioteca standard
int x[8]; // inicia um vector de inteiros chamado x com 8 pisições
// imprime o tabuleiro/
void print ()
{
int i,j;//inicia as variaveis i e j (vertical e horizontal)
printf ("#----------------#\n"); //imprime o topo
for (i=0; i<8; i++)
{
printf ("$"); //imprime a lateral do tabuleiro
for (j=0; j<8; j++) //ciclo de impressão das 8 rainhas
if (j==x[i]) printf ("[]"); //caso j seja igual a x[i] imprime rainha
else printf (" "); //caso contrario imprime espaço
printf ("$\n"); //muda de linha
}//sai so ciclo de impressão das laterais do tabuleiro e rainhas
printf ("#----------------#\n\n"); //imprime o fundo do tabuleiro
getchar(); //aguarda enter
}
int Blivre (int ix, int iy)//incia a função (Blivre) com duas variaveis do tipo int ix e iy e verifica se (ix, iy) é comivel por rainhas segundo as regras de xadrex 0 a (iy-1)
//esta função é chamada de forma recursiva na impressão do tabuleiro
{
int i; //inicia a variavel i
for (i=0; i<iy; i++) //inicia o ciclo de calculo de posição aleatória para as rainhas
if ((x[i]==ix) || (abs(x[i]-ix)==abs(i-iy))) return 0; // (caso x[i) não (absotulo de (x[i]-ix)==absoluto(i-iy) devolve o valor zero para impressão de rainha
return 1; //caso contrario devolve o valor 1 para impressão da rainha
}
/* coloca a rainha n na linha n n */
void coloca (int n) //colca rainha
{
int i; //inicia vaiavel i
int h; //inicia variavel h
if (n==8) print(); // se o valor de n for equivalente a 8 chama a funcão (print) para desenhar o tabuleiro e as rainhas (de forma recursiva)
else //caso contrario
for (i=0; i<8; i++) // inicia o ciclo e chama a função Blivre (i,n) para confirmar se é possivel imprimir a rainha de acordo com as regras
if (Blivre(i,n)) //chama a função de validação de possibilidade de imprimir a rainha e passa-lhe as variaveis (i,n)
{
x[n]=i; //x de n assume o valor de i
coloca (n+1); //imprime uma rainha na posição n+1
}
}
int main () //funcao main ou principal
{
coloca(0); //imprime a primeira solução possivel
getchar(); //aguarda enter
return 0; //Retorna zero
}