Contenuto cancellato Contenuto aggiunto
Annullata la modifica 101173309 di BlueCap88 (discussione)
Etichetta: Annulla
Annullata la modifica 101173294 di BlueCap88 (discussione)
Etichette: Sostituito Annulla
 
Riga 1:
.
<nowiki>#</nowiki>include <stdio.h>
 
<nowiki>#</nowiki>include <iostream>
 
// #include <string>
 
<nowiki>#</nowiki>include "sudoku2lib.h"
 
using namespace std;
 
type_tavola tab;
 
int livello_annidamento = 0;
 
int main()
 
{
 
  char orai[5] = {'?', '?', '?', '?', '?'};
 
  char oraf[5] = {'?', '?', '?', '?', '?'};
 
  int i = 1;
 
  int j = 1;
 
  int spia = 0;
 
  int tent = 0;
 
  int tentmille = 0;
 
  int tentmigli = 0;
 
  int tentmiliar = 0;
 
  // int tentativicella = 0;
 
  cout << "    Algoritmo di risoluzione del SUDOKU    " << endl;
 
  cout << "Ingegneria fisica - Politecnico di Milano  " << endl;
 
  cout << "     Informatica A - Prof. Sam Guinea      " << endl << endl << endl << endl;
 
  cout << "Inserire valori noti (0 se non si conosce)." << endl << endl;
 
  // string bla;
 
  // cout << "Debug: inserire una stringa:" << endl;
 
  // cin >> bla;
 
  // cout << "la stringa inserita è: " << bla << "!!!!!!"<< endl;
 
  /**********************************************/
 
  /*       Inserimento dei valori - BEGIN       */
 
  /**********************************************/ /*
 
  for (i = 1; i <= 9; i++) {
 
   cout << " RIGA " << i << endl;
 
   for (j = 1; j <= 9; j++) {
 
     do {
 
       cout << "(" << i << ":" << j << ")= " endl;
 
       cin >> tab[i][j].num; // non sono sicuro se serve passargli l'indirizzo, credo di sì in realtà!!
 
       if ((tab[i][j].num >= 1) && (tab[i][j].num <= 9)) // Da 1 a 9, il valore è certo
 
         tab[i][j].status=FOUND;
 
       else
 
         tab[i][j].status=EMPTY;
 
     } while (tab[i][j].num<0 || tab[i][j].num>9); // sotto 0 e sopra 9, ciclo da rifare
 
     if ((j % 3) == 0)
 
       cout << endl;
 
   }
 
   cout << endl;
 
  } */
 
  /********************************************/
 
  /*       Inserimento dei valori - END       */
 
  /********************************************/
 
  /***********************************************************/
 
  /*        PARTE TEMPORANEA: VALORI VALIDI ASSEGNATI        */
 
  /*       PER BYPASSARE L'INSERIMENTO MANUALE - BEGIN       */
 
  /***********************************************************/
 
  tab[1][1].num = 0; tab[1][2].num = 4; tab[1][3].num = 5;
 
  tab[1][4].num = 3; tab[1][5].num = 2; tab[1][6].num = 7;
 
  tab[1][7].num = 6; tab[1][8].num = 9; tab[1][9].num = 8;
 
  tab[2][1].num = 8; tab[2][2].num = 3; tab[2][3].num = 9;
 
  tab[2][4].num = 6; tab[2][5].num = 5; tab[2][6].num = 4;
 
  tab[2][7].num = 1; tab[2][8].num = 2; tab[2][9].num = 7;
 
  tab[3][1].num = 6; tab[3][2].num = 7; tab[3][3].num = 2;
 
  tab[3][4].num = 9; tab[3][5].num = 1; tab[3][6].num = 8;
 
  tab[3][7].num = 5; tab[3][8].num = 4; tab[3][9].num = 3;
 
  tab[4][1].num = 4; tab[4][2].num = 9; tab[4][3].num = 6;
 
  tab[4][4].num = 1; tab[4][5].num = 8; tab[4][6].num = 5;
 
  tab[4][7].num = 3; tab[4][8].num = 7; tab[4][9].num = 2;
 
  tab[5][1].num = 2; tab[5][2].num = 1; tab[5][3].num = 8;
 
  tab[5][4].num = 4; tab[5][5].num = 7; tab[5][6].num = 3;
 
  tab[5][7].num = 9; tab[5][8].num = 5; tab[5][9].num = 6;
 
  tab[6][1].num = 7; tab[6][2].num = 5; tab[6][3].num = 3;
 
  tab[6][4].num = 2; tab[6][5].num = 9; tab[6][6].num = 6;
 
  tab[6][7].num = 4; tab[6][8].num = 8; tab[6][9].num = 1;
 
  tab[7][1].num = 3; tab[7][2].num = 6; tab[7][3].num = 7;
 
  tab[7][4].num = 5; tab[7][5].num = 4; tab[7][6].num = 2;
 
  tab[7][7].num = 8; tab[7][8].num = 1; tab[7][9].num = 9;
 
  tab[8][1].num = 9; tab[8][2].num = 8; tab[8][3].num = 4;
 
  tab[8][4].num = 7; tab[8][5].num = 6; tab[8][6].num = 0; /**/
 
  tab[8][7].num = 2; tab[8][8].num = 3; tab[8][9].num = 5;
 
  tab[9][1].num = 5; tab[9][2].num = 2; tab[9][3].num = 1;
 
  tab[9][4].num = 8; tab[9][5].num = 3; tab[9][6].num = 9;
 
  tab[9][7].num = 7; tab[9][8].num = 6; tab[9][9].num = 4;
 
  for (i = 1; i <= 9; i++)
 
   for (j = 1; j <= 9; j++)
 
     tab[i][j].status = FOUND;
 
  tab[1][1].status = EMPTY;
 
  tab[8][6].status = EMPTY;
 
  /*********************************************************/
 
  /*       PARTE TEMPORANEA: VALORI VALIDI ASSEGNATI       */
 
  /*       PER BYPASSARE L'INSERIMENTO MANUALE - END       */
 
  /*********************************************************/
 
  cout << "I valori inseriti sono:\n" << endl;
 
  mostra_soluzione(tab);
 
  cout << "\nPremi un tasto per continuare.\n" << endl;
 
  fflush(stdin);
 
  // getchar();
 
  // controllo della validità  dei dati immessi
 
  if (!soluzione_valida(tab))
 
  {
 
   cout << "I dati inseriti contengono errori; il programma verra' terminato." << endl;
 
   fflush(stdin);
 
   getchar();
 
   return ERRORE;
 
  }
 
  /*
 
  cout << "Inserisci l'orario attuale [HH:MM]:" << endl;
 
  cin >> orai; // no indirizzo perché il char è già un puntatore a carattere
 
  fflush(stdin);
 
  cout << "Inizio della risoluzione..." << endl;
 
  */
 
  for (tent = 0;
 
                ( (soluzione_valida(tab) != OK   )
 
                  ||
 
                  (status_tabella  (tab) != FOUND)
 
                )
 
                &&
 
                (tentmigli < 500);
 
      tent++
 
     )
 
  {
 
   resetta_ipotesi(tab);
 
   // conteggio dei tentativi
 
   // WARNING: IL CONTEGGIO DEI TENTATIVI NON FUNZIONA PERCHE' L'ALGORITMO
 
   // ESCE DA "risolvi()" SOLO QUANDO LA SOLUZIONE È GIA' STATA TROVATA
 
   if (tent == 1000)
 
   {
 
     tent = 0;
 
     tentmille++;
 
     if (tentmille == 1000)
 
     {
 
       tentmille = 0;
 
       tentmigli++;
 
       if (tentmigli == 1000)
 
       {
 
         tentmigli = 0;
 
         tentmiliar++;
 
       }
 
     }
 
   }
 
   // Stampa del numero di tentativi
 
   if ((tent == 0) && ((tentmille % 50) == 0))
 
   {
 
     if (tentmiliar != 0)
 
       cout << tentmiliar << " miliardi ";
 
     if (tentmigli != 0)
 
       cout << tentmigli << " milioni ";
 
     if (tentmille != 0)
 
       cout << tentmille << " mila tentativi" << endl;
 
     else if (spia != 0)
 
       cout << "di tentativi" << endl;
 
     spia = 1;
 
   }
 
   // cuore dell'algoritmo
 
   risolvi(tab, &livello_annidamento);
 
   // Conclusioni
 
   if (soluzione_valida(tab) && status_tabella(tab)==FOUND) {
 
     cout << "La soluzione e' stata trovata!";
 
     cout << "Inserisci l'orario attuale [HH:MM]: " << endl;
 
     cin >> oraf;
 
     fflush(stdin);
 
     cout << "Inizio ore " << orai << "; fine ore " << oraf << "." << endl;
 
     cout << "Numero di tentativi: ";
 
     if (tentmiliar)
 
       cout << tentmiliar << " miliardi ";
 
     if (tentmigli)
 
       cout << tentmigli << " milioni ";
 
     if (tentmille)
 
       cout << tentmille << " mila ";
 
     cout << tent << "!" << endl;
 
     cout << "Premi un tasto per visualizzare la soluzione." << endl;
 
     getchar();
 
     fflush(stdin);
 
     mostra_soluzione(tab);
 
     getchar();
 
     return OK;
 
   }
 
   else
 
   {
 
     cout << "Soluzione non trovata, mi dispiace!!!" << endl;
 
     cout << "Il programma non dovrebbe mai visualizzare questa dicitura." << endl;
 
     cout << "Soluzione valida: " << soluzione_valida(tab) << "; status tabella: " << status_tabella(tab) << "." << endl;
 
     getchar();
 
     return ERRORE;
 
   }
 
  }
 
}