|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#61 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Io ho trovato codesto codice in C:
http://pubpages.unh.edu/~pas/hacks/sudoku/ Codice:
#define GRIDSIZE 9
#define MAXLINE GRIDSIZE+2
unsigned int grid[GRIDSIZE][GRIDSIZE];
unsigned int col[GRIDSIZE];
unsigned int row[GRIDSIZE];
unsigned int region[GRIDSIZE];
unsigned int istack[GRIDSIZE*GRIDSIZE];
unsigned int jstack[GRIDSIZE*GRIDSIZE];
unsigned int stackp;
void grid_input(char *filename);
void grid_display();
void placenum(unsigned n, unsigned i, unsigned j);
void removenum(unsigned n, unsigned i, unsigned j);
unsigned solve();
unsigned legal(unsigned n, unsigned i, unsigned j);
int main(int argc, char **argv)
{
clock_t c_start, c_end;
c_start = clock();
grid_input(argv[1]);
grid_display();
if (solve())
{
printf("Solution found!\n");
grid_display();
}
else
{
printf("No solution found\n");
}
c_end = clock();
printf("\nTempo impiegato -> %5.5f secondi\n", (double)(c_end - c_start) / CLOCKS_PER_SEC);
return 0;
}
/* read initial grid from specified file */
void grid_input(char *filename) {
FILE *fp;
char line[MAXLINE];
unsigned i,j;
if ((fp = fopen(filename, "r")) == NULL)
{
fprintf(stderr, "Couldn't open input file\n");
exit(1);
}
stackp = 0;
for (i = 0; i < GRIDSIZE; i++)
{
if (fgets(line, MAXLINE, fp))
{
for (j = 0; j < GRIDSIZE; j++)
{
if (line[j] >= '1' && line[j] <= '9')
{
placenum(line[j] - '0', i, j);
}
else /* assume empty */
{
istack[stackp] = i;
jstack[stackp] = j;
stackp++;
}
}
}
else
{
fprintf(stderr, "Unexpected input error\n");
exit(1);
}
}
}
/* solve grid with current stack of empty squares */
unsigned solve()
{
int n;
int i, j;
if (stackp <= 0) { /* no empty squares so */
return 1; /* solved */
}
stackp--;
i = istack[stackp];
j = jstack[stackp];
for (n = 1; n <= 9; n++)
{
if (legal(n, i, j))
{
placenum(n, i, j);
if (solve())
{
return 1;
}
removenum(n, i, j);
}
}
/* no solution at all from this point */
stackp++;
return 0;
}
/* is it legal to put value n at row i, column j? */
unsigned legal(unsigned n, unsigned i, unsigned j) {
return (grid[i][j] == 0) &&
((row[i] & (1 << (n-1))) == 0) &&
((col[j] & (1 << (n-1))) == 0) &&
((region[3 * (i/3) + (j/3)] & (1 << (n-1))) == 0);
}
/* place number n at row i, column j */
void placenum(unsigned n, unsigned i, unsigned j) {
unsigned r;
grid[i][j] = n;
row[i] ^= (1 << (n-1));
col[j] ^= (1 << (n-1));
region[3 * (i/3) + (j/3)] ^= (1 << (n-1));
}
/* remove number n at row i, column j */
void removenum(unsigned n, unsigned i, unsigned j) {
unsigned r;
grid[i][j] = 0;
row[i] ^= (1 << (n-1));
col[j] ^= (1 << (n-1));
region[3 * (i/3) + (j/3)] ^= (1 << (n-1));
}
/* display current grid */
void grid_display()
{
unsigned i, j;
for (i = 0; i < GRIDSIZE; i++) {
for (j = 0; j < GRIDSIZE; j++) {
printf("+---");
}
printf("+\n");
for (j = 0; j < GRIDSIZE; j++) {
if (grid[i][j] == 0) {
printf("| ");
}
else {
printf("| %d ", grid[i][j]);
}
}
printf("|\n");
}
for (j = 0; j < GRIDSIZE; j++) {
printf("+---");
}
printf("+\n");
}
Questo è il risultato per il sudoku proposto da DanieleC88:
Ultima modifica di Vincenzo1968 : 09-01-2013 alle 11:07. Motivo: Aggiornamento link |
|
|
|
|
|
#62 | |
|
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Quote:
![]() Ciao
__________________
|
|
|
|
|
|
|
#63 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Pensavo che il problema fosse integrare anche sudoku a soluzione non unica, invece pare non sia cosi'.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#64 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
|
|
|
|
|
|
#65 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Il mio problema sarebbe in questo caso quello di trovare quali sono le caselle implicate che possono avre piu' soluzioni plausibili, senza usare il backtracking, parente della forza bruta.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#66 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 533
|
■
Ultima modifica di rеpne scasb : 18-06-2012 alle 16:37. Motivo: Segnalazione bug. |
|
|
|
|
|
#67 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
repne, spero che se lavori in questo campo non programmi così perché nonostante la qualità indiscussa dell'algoritmo il codice è a dir poco illeggibile
|
|
|
|
|
|
#68 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Versione prolog con risolutore per domini finiti.
Sulla mia macchina ci mette circa 0.01-0.015 secondi per gli esempi visti prima, a prescindere dalle soluzioni (e.g. togliendo valori). Nell'esempio hard invece ci mette un bel po' di piu' La maggior parte del codice e' per l'input-output Codice:
charSymbol( '1', 1 ).
charSymbol( '2', 2 ).
charSymbol( '3', 3 ).
charSymbol( '4', 4 ).
charSymbol( '5', 5 ).
charSymbol( '6', 6 ).
charSymbol( '7', 7 ).
charSymbol( '8', 8 ).
charSymbol( '9', 9 ).
charSymbol( '0', N ):-
N #>= 1,
N #=< 9.
readSymbol( Stream, S ):-
get_char( Stream, C ),
charSymbol( C, S ),
get_char( Stream, _ ).
readSymbols( _ , [], 0 ).
readSymbols( Stream, [H|T], N ):-
readSymbol( Stream, H ),
M is N - 1,
readSymbols( Stream, T, M ).
readLine( Stream, Line ):-
readSymbols( Stream, Line, 9 ).
readLines( _ , [] , 0 ).
readLines( Stream, [H|T], N ):-
M is N-1,
readLine( Stream, H ),
readLines( Stream, T, M ).
readBoard( Filename, Board ):-
open( Filename, read, Stream ),
readLines( Stream, Board, 9 ),
close(Stream),
!.
printLine( [] ):-
write('\n').
printLine( [H|T] ):-
write(H),
write(' '),
printLine(T).
printBoard( [] ).
printBoard( [H|T] ):-
printLine(H),
printBoard(T).
columns( [], [], [] ).
columns( [[Cii|Cin] | C], [Cii|X],[Cin|Y]) :-
columns(C,X,Y).
transpose( [[]|_] , [] ).
transpose( M, [Ci|Cn] ):-
columns(M,Ci,R),
transpose( R, Cn ).
sum( [], 0 ).
sum( [H|T], N ):-
sum( T, M ),
N #= M + H.
rowsConstraints([]).
rowsConstraints([H|T]):-
fd_all_different(H),
sum( H, 45 ),
rowsConstraints(T).
colsConstraints(Board):-
transpose(Board,Columns),
rowsConstraints( Columns ).
dropRows( Matrix, Matrix, 0 ).
dropRows( Matrix, SubM, N ):-
M is N-1,
Matrix = [_|T],
dropRows( T, SubM, M ).
takeRows( _, [], 0 ).
takeRows( Matrix, SubM, N ):-
M is N-1,
Matrix = [H|MatrixT],
SubM = [H|SubMT],
takeRows( MatrixT, SubMT, M ).
flatten( [], [] ).
flatten( [H|T], Result ):-
flatten(T,X),
append(H,X,Result).
subMatrix( Matrix, SubM, RowBegin, ColBegin, RowLength, ColLength ):-
dropRows( Matrix, SM1, RowBegin ),
takeRows( SM1, SM2, RowLength ),
transpose(SM2,SM3),
dropRows( SM3, SM4, ColBegin ),
takeRows( SM4, SM5, ColLength ),
% transpose( SM5, SubM ).
flatten( SM5, SubM).
blocks(Board,Blocks):-
Blocks = [B1,B2,B3,B4,B5,B6,B7,B8,B9],
subMatrix(Board,B1,0,0,3,3),
subMatrix(Board,B2,0,3,3,3),
subMatrix(Board,B3,0,6,3,3),
subMatrix(Board,B4,3,0,3,3),
subMatrix(Board,B5,3,3,3,3),
subMatrix(Board,B6,3,6,3,3),
subMatrix(Board,B7,6,0,3,3),
subMatrix(Board,B8,6,3,3,3),
subMatrix(Board,B9,6,6,3,3).
blockConstraints(Board):-
blocks(Board,Blocks),
rowsConstraints( Blocks ).
constraints( Board ):-
rowsConstraints( Board ),
colsConstraints( Board ),
blockConstraints( Board ).
solve( Filename, Board ):-
readBoard( Filename, Board ),
constraints( Board ),
flatten(Board,Values),
fd_labeling( Values, [variable_method(first_fail)] ).
main:-
argument_value(1,Filename),
cpu_time(Begin),
solve(Filename,Solution),
cpu_time(End),
Time is End - Begin,
printBoard(Solution),
% write('Time needed:'),
% write(Time),
% write('\n').
:- initialization(main).
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele Ultima modifica di marco.r : 14-06-2009 alle 18:14. |
|
|
|
|
|
#69 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 533
|
■
Ultima modifica di rеpne scasb : 18-06-2012 alle 16:37. |
|
|
|
|
|
#70 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 533
|
■
Ultima modifica di rеpne scasb : 18-06-2012 alle 16:37. |
|
|
|
|
|
#71 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 533
|
■
Ultima modifica di rеpne scasb : 18-06-2012 alle 16:38. |
|
|
|
|
|
#72 | |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Quote:
Comunque buffa quella funzione CRC separata per formare CRC in ASCII art, ma trovo una cosa malsana scrivere codice in un certo modo...ghgh |
|
|
|
|
|
|
#73 | |
|
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Quote:
![]() Scusa ma che sono ste cose: 1[A] 7[b] eccetera? Un'oscura opzione del C ?!?!?
__________________
Ultima modifica di malocchio : 15-06-2009 alle 01:09. |
|
|
|
|
|
|
#74 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 533
|
■
Ultima modifica di rеpne scasb : 18-06-2012 alle 16:38. |
|
|
|
|
|
#76 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
Ma in quale direzione si dovrebbe leggere il codice? Comunque credo che sia molto più difficile scrivere codice in modo da formare un'ASCII art. E bisogna essere anche davvero bravi.
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#77 | |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Io lo trovo quasi elegante, nella sua semplicità (certo che se uno lo usa al di fuori di un contest simile a quello sopra mi viene qualche dubbio che sia un po' sadico
Quote:
Comunque ce ne sono altri anche più impressionanti (il simulatore di volo...). |
|
|
|
|
|
|
#78 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Si deve essere davvero bravi per fare cose del genere.
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
#79 | |
|
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Quote:
__________________
|
|
|
|
|
|
|
#80 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 533
|
■
Ultima modifica di rеpne scasb : 18-06-2012 alle 16:38. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:57.






















