No takhle, mám tři kódy, tento je poslední a nenapadá mě jak to dodělat na Sudoku X. Tento je teda s trojrozmernym polem. Pokud bych si oznacoval do toho navic diagonaly, tak to nefunguje. Nejake hinty?
#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]);
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){
printf("%d", p[i][j][k]);
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;
}