Ir para o conteúdo

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
}