Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
pika2112

Problemas 8 rainhas

Recommended Posts

pika2112

Estou a fazer o conhecido problema das 8 rainhas utilizando o DevC++

já vi e revi toda a linha de texto e está completamente correcta (acho eu), mas o programa abre mostra as soluções muito rapidamente e encerra sem tempo de ver algo.

Ja tentei o getchar();

Não sei o que se passa

#include <stdio.h>

#define DIM_TAB 8  /* dimensão do tabuleiro */

typedef enum { LIVRE, RAINHA, ATACADA } TCASA;  /* casa do tabuleiro */

/* alusão aos subprogramas */
void InicializarTabuleiro (TCASA [][]);
void ImprimirConfiguracao (TCASA [][]);
void CopiarTabuleiro (TCASA [][], TCASA [][]);
void ColocarRainhas (TCASA [][], int);

int main (void)
{
  TCASA Tabuleiro[DIM_TAB][DIM_TAB];  /* tabuleiro */

  InicializarTabuleiro (Tabuleiro);

  ColocarRainhas (Tabuleiro, 0);

  return 0;
}

/* definição dos subprogramas */

void InicializarTabuleiro (TCASA ptabuleiro[][DIM_TAB])
{
  unsigned int Linha, Coluna;

  for (Linha = 0; Linha < DIM_TAB; Linha++)
    for (Coluna = 0; Coluna < DIM_TAB; Coluna++)
      ptabuleiro[Linha][Coluna] = LIVRE;
}

void ImprimirConfiguracao (TCASA ptabuleiro[][DIM_TAB])
{
  unsigned int Linha, Coluna; static unsigned int Conf = 0;

  printf ("Configuração nº %2d", ++Conf);

  for (Coluna = 0; Coluna < DIM_TAB; Coluna++)
    for (Linha = 0; Linha < DIM_TAB; Linha++)
      if (ptabuleiro[Linha][Coluna] == RAINHA)
      {
        printf (" - %d", Linha+1);
        break;
      }

  printf ("\n");
}

void CopiarTabuleiro (TCASA ptorig[][DIM_TAB], TCASA ptdest[][DIM_TAB])
{
  unsigned int Linha, Coluna;

  for (Linha = 0; Linha < DIM_TAB; Linha++)
    for (Coluna = 0; Coluna < DIM_TAB; Coluna++)
      ptdest[Linha][Coluna] = ptorig[Linha][Coluna];
}

void ColocarRainhas (TCASA ptabuleiro[][DIM_TAB], int pnrainhas)
{
  unsigned int Linha, Col; int DAsc, DDesc;
  TCASA TabAuxiliar[DIM_TAB][DIM_TAB];  /* tabuleiro auxiliar */

  if (pnrainhas == DIM_TAB)  /* condição de paragem */
    ImprimirConfiguracao (ptabuleiro);
  else
  {
    Linha = 0;
    while (Linha < DIM_TAB)
    {
      /* determinar a primeira linha livre para colocar a rainha */
      while (ptabuleiro[Linha][pnrainhas] != LIVRE && Linha < DIM_TAB) Linha++;

      if (Linha < DIM_TAB)
      {
        /* armazenar a configuração antes de colocar a rainha  */
        CopiarTabuleiro (ptabuleiro, TabAuxiliar);

        /* colocar a rainha na linha livre */
        ptabuleiro[Linha][pnrainhas] = RAINHA;

        DAsc = Linha-1; DDesc = Linha+1;
        for (Col = pnrainhas+1; Col < DIM_TAB; Col++, DAsc--, DDesc++)
        {
          /* marcar a linha atacada */
          ptabuleiro[Linha][Col] = ATACADA;
          /* marcar a diagonal ascendente atacada */
          if (DAsc >= 0) ptabuleiro[DAsc][Col] = ATACADA;
          /* marcar a diagonal descendente atacada */
          if (DDesc < DIM_TAB) ptabuleiro[DDesc][Col] = ATACADA;
        }

        /* invocação recursiva */
        ColocarRainhas (ptabuleiro, pnrainhas+1);

        /* recuperar a configuração anterior */
        CopiarTabuleiro (TabAuxiliar, ptabuleiro);

        /* marcar a linha anteriormente testada como atacada */
        ptabuleiro[Linha][pnrainhas] = ATACADA;

        /* passar à linha seguinte */
        Linha++;
      }
    }
  }
}

Share this post


Link to post
Share on other sites
migg

tem erro esse programa n consigo compilar e para resolver o problema de aparecer e desaparecer uteliza a bibloteca stdlib e mete system("pause"); no final

assim

#include <stdio.h>
#include <stdlib.h>




#define DIM_TAB 8  /* dimensão do tabuleiro */

typedef enum { LIVRE, RAINHA, ATACADA } TCASA;  /* casa do tabuleiro */

/* alusão aos subprogramas */
void InicializarTabuleiro (TCASA [][]);
void ImprimirConfiguracao (TCASA [][]);
void CopiarTabuleiro (TCASA [][], TCASA [][]);
void ColocarRainhas (TCASA [][], int);

int main (void)
{
  TCASA Tabuleiro[DIM_TAB][DIM_TAB];  /* tabuleiro */

  InicializarTabuleiro (Tabuleiro);

  ColocarRainhas (Tabuleiro, 0);

  return 0;
}

/* definição dos subprogramas */

void InicializarTabuleiro (TCASA ptabuleiro[][DIM_TAB])
{
  unsigned int Linha, Coluna;

  for (Linha = 0; Linha < DIM_TAB; Linha++)
    for (Coluna = 0; Coluna < DIM_TAB; Coluna++)
      ptabuleiro[Linha][Coluna] = LIVRE;
}

void ImprimirConfiguracao (TCASA ptabuleiro[][DIM_TAB])
{
  unsigned int Linha, Coluna; static unsigned int Conf = 0;

  printf ("Configuração nº %2d", ++Conf);

  for (Coluna = 0; Coluna < DIM_TAB; Coluna++)
    for (Linha = 0; Linha < DIM_TAB; Linha++)
      if (ptabuleiro[Linha][Coluna] == RAINHA)
      {
        printf (" - %d", Linha+1);
        break;
      }

  printf ("\n");
}

void CopiarTabuleiro (TCASA ptorig[][DIM_TAB], TCASA ptdest[][DIM_TAB])
{
  unsigned int Linha, Coluna;

  for (Linha = 0; Linha < DIM_TAB; Linha++)
    for (Coluna = 0; Coluna < DIM_TAB; Coluna++)
      ptdest[Linha][Coluna] = ptorig[Linha][Coluna];
}

void ColocarRainhas (TCASA ptabuleiro[][DIM_TAB], int pnrainhas)
{
  unsigned int Linha, Col; int DAsc, DDesc;
  TCASA TabAuxiliar[DIM_TAB][DIM_TAB];  /* tabuleiro auxiliar */

  if (pnrainhas == DIM_TAB)  /* condição de paragem */
    ImprimirConfiguracao (ptabuleiro);
  else
  {
    Linha = 0;
    while (Linha < DIM_TAB)
    {
      /* determinar a primeira linha livre para colocar a rainha */
      while (ptabuleiro[Linha][pnrainhas] != LIVRE && Linha < DIM_TAB) Linha++;

      if (Linha < DIM_TAB)
      {
        /* armazenar a configuração antes de colocar a rainha  */
        CopiarTabuleiro (ptabuleiro, TabAuxiliar);

        /* colocar a rainha na linha livre */
        ptabuleiro[Linha][pnrainhas] = RAINHA;

        DAsc = Linha-1; DDesc = Linha+1;
        for (Col = pnrainhas+1; Col < DIM_TAB; Col++, DAsc--, DDesc++)
        {
          /* marcar a linha atacada */
          ptabuleiro[Linha][Col] = ATACADA;
          /* marcar a diagonal ascendente atacada */
          if (DAsc >= 0) ptabuleiro[DAsc][Col] = ATACADA;
          /* marcar a diagonal descendente atacada */
          if (DDesc < DIM_TAB) ptabuleiro[DDesc][Col] = ATACADA;
        }

        /* invocação recursiva */
        ColocarRainhas (ptabuleiro, pnrainhas+1);

        /* recuperar a configuração anterior */
        CopiarTabuleiro (TabAuxiliar, ptabuleiro);

        /* marcar a linha anteriormente testada como atacada */
        ptabuleiro[Linha][pnrainhas] = ATACADA;

        /* passar à linha seguinte */
        Linha++;
      }
    }
  }

system("pause");
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.