Witam, znalazłem kod pewnego użytkownika na tym forum:
msm napisał(a):
Mam wrażenie, że to nie jest tak krotkie na jakie wygląda... Tam nie ma tylko kilka pętli i ifow, trzeba dodatkowe metody dorobić. Prawda?
może coś takiego: http://www.thelearningpoint.ne[...]cience/c-program-sudoku-solver w porównaniu z innymi, które widziałam w C w internecie wydaje się prosty. - karolinaa dzisiaj, 15:24
Gotowiec rozwiązujący sudoku który niedawno dla kogoś innego na forum napisałem:
bool solve(int x, int y);
int sudoku[9][9] = { /* tu zadane sudoku... */ };
int curr[9][9];
bool can_insert(int x, int y, int value) {
for(int i = 0; i < 9; i++) {
if (value == curr[x][i] || value == curr[i][y] ||
value == curr[x/3*3+i%3][y/3*3+i/3]) return false;
} return true;
}
bool next(int x, int y) {
if (x == 8 && y == 8) return true;
else if (x == 8) return solve(0, y + 1);
else return solve(x + 1, y);
}
bool solve(int x, int y) {
if (sudoku[x][y] == 0) {
for(int i = 1; i <= 9; i++) {
if (can_insert(x, y, i)) {
curr[x][y] = i;
if (next(x, y)) return true;
}
} curr[x][y] = 0; return false;
} return next(x, y);
}
Prosty? Prosty ;].
Zasadniczo dokładnie ten sam algorytm co na wikipedii.Można poprawić trochę wydajność algorytmu (tzn. stałą w czasie wykonania), np. eliminując dzielenie w can_insert itd, ale starałem się jak najprostszy kod podać (zresztą jeśli przyjdzie tu Dragon to i tak mi to wypomni).
Żeby uruchomić algorytm z jakimiś testowymi danymi:
int sudoku[9][9]= {
{0,1,0,0,5,6,2,7,0},
{0,0,0,0,8,0,0,0,9},
{0,7,8,0,0,3,6,0,5},
{0,0,0,0,0,4,5,0,1},
{8,5,2,0,0,0,7,3,4},
{6,0,1,7,0,0,0,0,0},
{1,0,6,4,0,0,9,5,0},
{3,0,0,0,6,0,0,0,0},
{0,2,7,3,9,0,0,8,0}
};
/* podany wyżej kod tutaj */
int main() {
for(int i=0; i<9; i++)
for(int j=0; j<9; j++)
curr[i][j] = sudoku[i][j];
if (solve(0,0)) {
for(int i=0; i<9; i++) {
for(int j=0; j<9; j++) {
cout<<curr[i][j];
} cout<<endl;
}
} else {
cout<<"impossible\n";
}
return 0;
}
Jednak nie rozumiem zbytnio jego działania.. Czy ktoś mógłby go wytłumaczyć? A może znalazłaby się jakaś dobra dusza, która chciałaby napisać ten program w prostszy sposób? Nie rozumiem na przykład: bool solve(int x, int y);
...
Z góry dziękuję za pomoc.