[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[obm-l] Re: [obm-l] resta um -táticas" ajuda "



Eu estou até com vergonha de dizer isso, mas escrevi um programa que tenta todas as jogadas possíveis e vê se tem solução...
Supondo que eu tenha entendido direito a configuração triangular que o Haroldo pediu:

0
1  2
3  4  5
6  7  8  9
10 11 12 13 14

Meu programa disse que não tem solução, não importa onde o buraco vazio comece.

Claro que essa técnica exaustiva só funciona para tabuleiros pequenos como esse... Coloquei o computador do meu pai (1.2 GHz) para
rodar com o de 33 posições, vamos ver o que acontece... Provavelmente amanhã de manhã eu vou desistir ;)

Caso alguém se interesse, aqui está o código... Para testar com outro tabuleiro mude as coisas no começo. Este aqui está com o
tabuleiro triangular.

- Juliana


/* @BEGIN_OF_SOURCE_CODE */

#include <stdio.h>
#define TAMANHO_TABULEIRO 15
#define NUMERO_JOGADAS 24

/*tabuleiro:
  0
  1  2
  3  4  5
  6  7  8  9
 10 11 12 13 14
  */

/* jogada: casa inicial, casa do meio, casa final */
int jogadas[NUMERO_JOGADAS][3] =
{
  { 0, 1, 3}, { 1, 3, 6}, { 2, 4, 7}, { 3, 6,10},
  { 3, 4, 5}, { 3, 1, 0}, { 4, 7,11}, { 5, 8,12},
  { 5, 4, 3}, { 6, 3, 1}, { 6, 7, 8}, { 7, 4, 2},
  { 7, 8, 9}, { 8, 7, 6}, { 9, 8, 7}, {10, 6, 3},
  {10,11,12}, {11, 7, 4}, {11,12,13}, {12,11,10},
  {12, 8, 5}, {12,13,14}, {13,12,11}, {14,13,12}
};

/* o caminho até a posição vencedora terá 13 passos,
   porque é o número de peças que precisam ser comidas */
/* a posicao 0 guarda a casa de origem, a posição 1
   guarda a casa de destino */
int caminho[TAMANHO_TABULEIRO - 2][2];
int j; /* em qual passo estamos */
int t[TAMANHO_TABULEIRO]; /* o tabuleiro */

void passo();

void main()
{
  int i;
  int k;
  for (k=0;k<TAMANHO_TABULEIRO;k++)
  {
    printf("casa vazia = %d\n\n",k);
    for (i=0;i<TAMANHO_TABULEIRO;i++) t[i] = 1;
    t[k] = 0; /* a casa que começa vazia */
    j = 0;
    passo();
  }
}

/* função recursiva de backtracking */
void passo()
{
  int i,k;
  for (i=0;i<NUMERO_JOGADAS;i++) /* para cada jogada que existe */
  {
    /* dá pra fazer essa jogada agora? */
    if ( t[jogadas[i][0]] == 1 &&
         t[jogadas[i][1]] == 1 &&
         t[jogadas[i][2]] == 0 )
    {
      /* faz a jogada */
      t[jogadas[i][0]] = 0;
      t[jogadas[i][1]] = 0;
      t[jogadas[i][2]] = 1;
      caminho[j][0] = jogadas[i][0];
      caminho[j][1] = jogadas[i][2];
      j++;
      if (j==TAMANHO_TABULEIRO - 2) /* é uma posição final? */
      { /* sim: imprime o caminho */
        printf("caminho:\n");
        for (k=0;k<TAMANHO_TABULEIRO - 2;k++)
          printf("%4d%4d\n",caminho[k][0],caminho[k][1]);
        printf("\n");
      } else
        passo(); /* não: continua */
      /* desfaz a jogada */
      t[jogadas[i][0]] = 1;
      t[jogadas[i][1]] = 1;
      t[jogadas[i][2]] = 0;
      j--;
    }
  }
}

/* @END_OF_SOURCE_CODE */

----- Original Message -----
From: "Nicolau C. Saldanha" <nicolau@sucuri.mat.puc-rio.br>
To: <obm-l@mat.puc-rio.br>
Sent: Friday, April 05, 2002 6:06 PM
Subject: [obm-l] Re: [obm-l] Re: [obm-l] resta um -táticas" ajuda "


On Fri, Apr 05, 2002 at 05:55:06PM -0300, Juliana Freire wrote:
> "Como determinar" eu não sei...
> Na verdade não tenho a menor idéia de qual a lógica por trás disto,
> mas quando eu era criança uma vez meu avô conseguiu resolver sem
> querer, e eu decorei a solução.
> Vamos numerar as casas do tabuleiro assim:
>
>        1  2  3
>        4  5  6
>  7  8  9 10 11 12 13
> 14 15 16 17 18 19 20
> 21 22 23 24 25 26 27
>       28 29 30
>       31 32 33

O volume 2 do livro Winning Ways de Berlekamp, Conway e Guy
tem um monte de coisa sobre este jogo.

Um problema extra pouco conhecido é deixar só um com o buraco
inicial em qualquer posição dada, devendo o último pino ficar
na posição do buraco inicial.

Tem também o problema da OBM de provar que, começando com o buraco
no centro, o último pino *deve* ficar em uma das posições 2, 14, 17,
20 ou 32.

[]s, N.

[]s, N.
=========================================================================
Instruções para entrar na lista, sair da lista e usar a lista em
http://www.mat.puc-rio.br/~nicolau/olimp/obm-l.html
O administrador desta lista é <nicolau@mat.puc-rio.br>
=========================================================================


=========================================================================
Instruções para entrar na lista, sair da lista e usar a lista em
http://www.mat.puc-rio.br/~nicolau/olimp/obm-l.html
O administrador desta lista é <nicolau@mat.puc-rio.br>
=========================================================================