Anonymní profil Epoxi – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Epoxi – Programujte.comAnonymní profil Epoxi – Programujte.com

 

Příspěvky odeslané z IP adresy 147.32.11.–

Epoxi
C / C++ › Sudoku X
28. 11. 2013   #184511

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;
}

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032022 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý