/******************************************************************** Funzione ricorsiva di ricerca di una soluzione ********************************************************************/ int trova(int **schema, int dim, int passo) { int i, j, k; /* verifica di terminazione */ if (passo >= dim*dim) { return 1; } /* indici casella corrente */ i = passo / dim; j = passo % dim; if (schema[i][j] != 0) { /* casella inizialmente piena: nessun tentativo da fare */ return trova(schema, dim, passo+1); } /* provo tutti i possibili valori da 1 a dim */ for (k=1; k<=dim; k++) { schema[i][j] = k; if (controlla(schema, dim, passo)) { if (trova(schema, dim, passo+1)) { return 1; } } schema[i][j] = 0; } return 0; }
/******************************************************************** Programma principale ********************************************************************/ int main() { int **schema, dim, i, j, risultato; char nomefile[20]; printf("Inserire il nome del file: "); //scanf("%s", nomefile); schema = acquisisci("sudoku.txt", &dim); //nomefile, &dim); if (trova(schema, dim, 0)) { printf("Soluzione:\n"); for (i=0; i<dim; i++) { for (j=0; j<dim; j++) { printf("%3d ", schema[i][j]); } printf("\n"); } } else { printf("Nessuna soluzione trovata.\n"); } for (i=0; i<dim; i++) { free(schema[i]); } free(schema); return risultato; }
/* * riceve come parametri un codice a barre (barcode) e un vettore di tipo PFN e, usando la * funzione trova() per trovare il farmaco corrispondente, * restituisce 1 se il farmaco identificato dal codice è mutuabile, 0 altrimenti */ int esente (unsigned long int barcode, PFN pfn) { int i = trova(barcode, pfn); int ris; if (i >= 0) { ris = pfn[i].mutuabileSiNo; } else { ris = i; } return ris; }