Matematické Fórum

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

#1 06. 10. 2013 21:11

SoniCorr
Příspěvky: 608
Reputace:   
 

Sudoku v C

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

Code:

/*
 *
 * 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

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson