#include <stdio.h>
#include <conio.h>
#define  uint  unsigned int

/*------------------------------------------------------------------------
  Programmma per la soluzione del solitario del 35, di Luigi Lamberti
--------------------------------------------------------------------------*/
void Maschera  ( void );
void VediCampo ( int *, int );
void Valuta    ( int *, int *, int *, int k);

//=========================================================================
void main ( void )
{ int  Campo [150],
       Mosse[] = { -39, -28, -24, -3, 3, 24, 28, 39 },
       i;
  uint Soluzioni; 

  Maschera();
  for (i=0; i<143; Campo[i++]= -1);
  for (i=42; i<=48; i++)
    Campo[i] = Campo[i+13] = Campo[i+26] = Campo[i+39] = Campo[i+52] = 0;
  Campo[71] = 1;
  Soluzioni = 0;

  Valuta (Campo, Mosse, &Soluzioni, 71);

  getch();
}

/*==========================================================================
  Funzione per la valutazione delle soluzioni.
--------------------------------------------------------------------------*/
void Valuta
( int  *Campo,     // Campo di gioco
  int  *Mosse,     // sequenza delle otto mosse possibili
  uint *Soluzioni, // Numero totale delle soluzioni trovate
  int  k           // Ultima casella occupata
)
{ int i, h;

  for (i=0; i<8; i++)
  { h = k + Mosse[i];
    if (Campo[h] == 0) // la casella Š vuota
    { Campo[h] = Campo[k] + 1;
      if (Campo[h] < 35)
        Valuta (Campo, Mosse, Soluzioni, h);
      else
      { (*Soluzioni) ++; VediCampo (Campo, *Soluzioni);
      }
      Campo[h] = 0;
    }
  }
}

/*========================================================================
  Visualizza il Campo di Gioco
------------------------------------------------------------------------*/
void VediCampo
( int  *Campo,    // Campo di gioco
  uint Soluzioni  // Numero totale delle soluzioni trovate
)
{ int i, j;

  textbackground(0); textcolor(14);
  for (i=0; i<5; i++)
    for (j=0; j<7; j++)
    { gotoxy (25+j*5, 7+i*2); cprintf ("%2d", Campo [42+i*13+j]);
    }
  textcolor(15); gotoxy (10, 22); cprintf ("Soluzioni %5u", Soluzioni);
}

/*=========================================================================
  Maschera di gioco
--------------------------------------------------------------------------*/
void Maschera
( void
)
{ int i;

  clrscr();
  textbackground(4); textcolor(0);
  gotoxy( 2, 1); for(i=2;i<=79;cprintf(" "),i++);
  gotoxy(25, 1); cprintf("S O L I T A R I O d e l 3 5");
  gotoxy ( 2,25); for(i=2;i<=79;cprintf(" "),i++);
  gotoxy(58,25); cprintf("di Luigi Lamberti");

  textbackground(0); textcolor(3);
  gotoxy(23, 6); cprintf("+----+----+----+----+----+----+----+");
  gotoxy(23, 7); cprintf("|    |    |    |    |    |    |    |");
  gotoxy(23, 8); cprintf("+----+----+----+----+----+----+----+");
  gotoxy(23, 9); cprintf
("|    |    |    |    |    |    |    |");
  gotoxy(23,10); cprintf("+----+----+----+----+----+----+----+");
  gotoxy(23,11); cprintf(
"|    |    |    |    |    |    |    |");
  gotoxy(23,12); cprintf("+----+----+----+----+----+----+----+");
  gotoxy(23,13); cprintf
("|    |    |    |    |    |    |    |");
  gotoxy(23,14); cprintf("+----+----+----+----+----+----+----+");
  gotoxy(23,15); cprintf
("|    |    |    |    |    |    |    |");
  gotoxy(23,16); cprintf("+----+----+----+----+----+----+----+");
}