Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Zdravím, mám napsaný sudoku solver podobně podle knihy algoritmy v C a C++. Jde o to, že tohle je solver pro normální sudoku. Mám napsat solver pro diagonalni sudoku. Napadlo me, ze bych si nechal vyjet reseni a pak si nechat jednotlive prvky pole zkontrolovat podminkou, jestli odpovida pozadavkum diagonalniho sudoku. Pokud ne, tak bych se odkazal (bohuzel asi pres goto) na novy pruchod reseni, dokud by nevypadlo spravne reseni. Chtel jsem pouzit selectsort. Ma nekdy rozumejsi napad? Programuju zhruba 2 mesice, nemam moc velke zkusenosti.
o
/* * * Sudoku solver 1.0 * ================= * */ #include <stdlib.h> #include <stdio.h> FILE *fr; FILE *fw; int i, j, k, dost, n, vyber; int e, f; int sudoku[9][9]; int r[81]; int s[81]; int t[81]; int p[9][9][9]; char *jmeno = "sudoku.txt"; int radek, sloupec; int oznac(short u, short v, short x) { short i, j; for(i = 0; i < 9; i++) if(p[u][i][x] == e) p[u][i][x] = f; for(i = 0; i < 9; i++) if(p[i][v][x] == e) p[i][v][x] = f; if(u < 3) u = 0; else if (u < 6) u = 3; else u = 6; if (v < 3) v = 0; else if (v < 6) v = 3; else v = 6; for (i = u; i < u + 3; i++) for (j = v; j < v + 3; j++) if(p[i][j][x] == e) p[i][j][x] = f; return 0; } int main(void) { printf("Sudoku solver v1.0\n"); printf("==================\n"); int a; printf("\nZadejte zadani, 0 predstavuje prazdne pole\n\n"); for(radek = 0; radek < 9; radek++) { printf("zadejte hodnoty %d. radku\n", radek + 1); for(sloupec = 0; sloupec < 9; sloupec++) scanf("%d",&sudoku[radek][sloupec]); } a = 1; while(a > 0) { printf("kontrolni vypis\n"); for(radek = 0; radek < 9; radek++) { for(sloupec = 0; sloupec < 9; sloupec++) printf("%d ", sudoku[radek][sloupec]); printf("\n"); } printf("zadejte c.radku pro opravu nebo nulu pro konec\n"); scanf("%d", &a); if(a != 0) { for (sloupec = 0; sloupec < 9; sloupec++) scanf("%d ", &sudoku[k-1][sloupec]); } fw = fopen(jmeno, "w"); for(radek = 0; radek < 9; radek++) for(sloupec = 0; sloupec < 9; sloupec++) fprintf(fw, "%d\n", sudoku[radek][sloupec]); fclose(fw); } if((fr = fopen(jmeno, "rt")) == NULL){ printf("Soubor nebyl otevren\n"); return 1; } for(i = 0; i < 9; i++) for(j = 0; j < 9; j++) fscanf(fr, "%d", &sudoku[i][j]); printf("\nzadani\n\n"); for(i = 0; i < 9; i++) { for(j = 0;j < 9; j++) printf("%d ", sudoku[i][j]); printf("\n"); } e = 0; f = 1; for (i = 0; i < 9; i++) for(j = 0; j < 9; j++) if(sudoku[i][j] > 0) oznac(i, j, sudoku[i][j]); /* int oznac(short u, short v, short x) { short i, j; for(i = 0; i < 9; i++) if(p[u][i][x] == e) p[u][i][x] = f; for(i = 0; i < 9; i++) if(p[i][v][x] == e) p[i][v][x] = f; if(u < 3) u = 0; else if (u < 6) u = 3; else u = 6; if (v < 3) v = 0; else if (v < 6) v = 3; else v = 6; for (i = u; i < u + 3; i++) for (j = v; j < v + 3; j++) if(p[i][j][x] == e) p[i][j][x] = f; return 0; } */ n = 0; k = 1; i = 0; j = 0; while(i < 9) { if(sudoku[i][j] == 0){ dost = 0; while ((k < 10) && (dost == 0)){ if(p[i][j][k] == 0){ sudoku[i][j] = k; e = 0; dost = 1; r[n] = i; s[n] = j; t[n] = k; n++; f = n + 1; oznac(i,j,k); } else k++; } if (dost == 0) { do{ n--; if(n < 0) { printf("neexistuje reseni\n"); scanf("%d", &e); return 1; } else { i = r[n]; j = s[n]; k = t[n]; e = n+2; f = 0; oznac(i,j,k); sudoku[i][j] = 0; k++; } } while( k >= 10); continue; } } k = 1; j++; if(j >= 9) {i++; j = 0;} } printf("\nvysledek\n\n"); for(i = 0; i < 9; i++) { for(j = 0;j < 9; j++) printf("%d ", sudoku[i][j]); printf("\n"); } scanf("%d", &e); return 0; }
Offline