sudoku - generowanie liczb

0

witam,
mam problem ze sprawdzaniem poprawnosci losowo wygenreowanej ukladanki sudoku. Umiem wygenerowac losowe liczby, ale chcialabym, aby liczby spelnialy warunki ukladanki sudoku.
kod funkcji sprawdzajacej warunki sudoku:

 int input_value(int x, int y, int value){
        int i,j;
// Scan horizontally and vertically
for (i = 0; i < 9; i++) {
         if (value == outputArray[i][y] || value == outputArray[x][i]) {
return 0;
}
}
// Scan its own square
if (x < 3) {
        if (y < 3) {
                for (i = 0; i < 3; i++) {
                         for (j = 0; j < 3; j++) {
                                  if (value == outputArray[i][j]) {
return 0;
}
}
         }
} else if (y < 6) {
         for (i = 0; i < 3; i++) {
                  for (j = 3; j < 6; j++) {
                           if (value == outputArray[i][j]) {
                                   return 0;
 
}
}
                  }
         } else {
                  for (i = 0; i < 3; i++) {
                           for (j = 6; j < 9; j++) {
                                    if (value == outputArray[i][j]) {
                                            return 0;
                                    }
                           }
                  }
         }
} else if (x < 6) {
         if (y < 3) {
                  for (i = 3; i < 6; i++) {
                           for (j = 0; j < 3; j++) {
                                    if (value == outputArray[i][j]) {
                                            return 0;
                                    }
                           }
                  }
         } else if (y < 6) {
        for (i = 3; i < 6; i++) {
                 for (j = 3; j < 6; j++) {
                          if (value == outputArray[i][j]) {
                                  return 0;
                          }
                 }
        }
} else {
 
for (i = 3; i < 6; i++) {
         for (j = 6; j < 9; j++) {
                  if (value == outputArray[i][j]) {
                          return 0;
                  }
         }
}
        }
} else {
        if (y < 3) {
                 for (i = 6; i < 9; i++) {
                          for (j = 0; j < 3; j++) {
                                   if (value == outputArray[i][j]) {
                                           return 0;
                                   }
                          }
                 }
        } else if (y < 6) {
                 for (i = 6; i < 9; i++) {
                          for (j = 3; j < 6; j++) {
                                   if (value == outputArray[i][j]) {
                                           return 0;
                                   }
                          }
                 }
        } else {
                 for (i = 6; i < 9; i++) {
                          for (j = 6; j < 9; j++) {
                                   if (value == outputArray[i][j]) {
                                           return 0;
                                   }

}
}
}
}
return value;
}

a to kod generujacy te liczby:

int main(){

randomize();
int ile;
      cout<<"ile elementow?";
      cin>>ile;
      if(ile >=81)
      {
        cout<<"zla liczba";
      }

  int outputArray[8][8];
  for(int i =0; i<9; i++)
  {
      for(int j =0; j<9; j++)
        {
            outputArray[i][j] = 0;
        }
  }

  int czySieZgadza ;
  czySieZgadza = 0;

 do
  {
        int wiersz = random(9);
        int kolumna = random(9);
        if (outputArray[wiersz][kolumna] == 0)
        {
               outputArray[wiersz][kolumna] = 1;
               czySieZgadza++;
        }

  }while( czySieZgadza <=ile) ;

  for(int i =0; i<9; i++)
  {
      for(int j =0; j<9; j++)
        {
            while(outputArray[i][j] == 1)
            {
            //---------------------------------------------
                outputArray[i][j] = random(9)+1;

                while(input_value(i,j,outputArray[i][j]) == 0)
                {
                       outputArray[i][j]=random(9)+1;
                }
            //---------------------------------------------
            }
            cout<<outputArray[i][j];
        } cout<<"\n";
}
        system("pause");
return 0;
}
  }



 
0

http://4programmers.net/Forum/Algorytmy/187815-sudoku_-_ilosc_rozwiazan

Ja bym generował planszę na podstawie pełnej już gotowej, a potem

  1. przemieszaj losowo wiersze kolumny w ramach trójek
  2. przemieszaj losowo bloki trójek wierszy i kolumn
  3. wyzeruj losowo nadmiarowe pola
  4. sprawdź liczbę rozwiązań
    W ten sposób będziesz miał gwarancje poprawności
0

Generowanie planszy potrzebne jest mi do dalszej części projektu, w którym do rozwiązywania sudoku używam backtrackingu. Dlatego tutaj najpierw chciałam wypełnić pustą plansze losowymi liczbami zgodnie z zasadami układanki, sprawdzić backtrackingiem, a potem "zaciemniać" wybrane losowo pola.

0

oto moje drugie podejście do problemu...

Opis funkcji, która powinna generować sudoku:

  1. na początku proszę o podanie poziomu trudności
    2)zeruje macierz pomocnicza i glówna
    3)w zaleznosci od poziomu trudnosci ustalam ilosc liczb do wylosowania
    4)wyznaczam losowo komorki macierzy: tym, ktore sa jeszcze puste przypisuje 1, w przeciwnym razie losuje jeszcze raz az do znalezienia pustej komorki i wyczerpania liczb odpowiedzialnych za poziom trudnosci
    5)jesli w tablicy tymczasowej
array

w danej komorce wystepuje 1 to w macierzy glownej outputArray

 wpisuje losawa liczbe z przedzialu  [1-9]
6)sprawdzam to funkcja 
```cpp
 backtrack

, ktora powinna wypelniac tablice i ewentualnie zwrocic false, gdy nie mozna jej wypelnic (sprzecznosc z zasadami sudoku)
7) jesli wszystko jest dobrze to powinnam otrzymywac prawidlowo zapelniona tablice (pozniej chce zaciemniac pola), a jeśli nie to cały proces zaczyna się od pkt 2)

Problem polega na tym, ze (chyba) funkcja backtrack nawala ... nie wiem dlaczego... dodam, ze działa dobrze przy rozwiązywaniu zadanej planszy

funkcja backtrack:

 
int backtrack(int x, int y) {
          int temp,i,j;
          if (outputArray[x][y] == 0) {
                  for (i = 1; i < 10; i++) {
                           temp = input_value(x,y,i);
                           if (temp > 0) {
                                   outputArray[x][y] = temp;
      if (x == 8 && y == 8) {
        return 1;
      } else if (x == 8) {
        if (backtrack(0,y+1)) return 1;
      } else {
        if (backtrack(x+1,y)) return 1 ;
      }
                           }
                  }
                  if (i == 10) {
    if (outputArray[x][y] != array[x][y]) outputArray[x][y] = 0;
                           return 0;
                  }
          } else {
                  if (x == 8 && y == 8) {
                           return 1;
                  } else if (x == 8) {

        if (backtrack(0,y+1)) return 1;
} else {
        if (backtrack(x+1,y)) return 1;
}
}
}

***funkcja input_value zostala wrzucona przeze mnie we wczesniejszym poscie.

funkcja generuj():

 
void generuj()
{
    srand((unsigned)time(NULL));

    int poziom, i,j, ile_losowac, czySieZgadza;
    poczatek:
    cout<<"Podaj poziom trudnosci \n1.latwe 2.srednie 3.trudne ";
    cin>>poziom;
    generowanie:
        for(i=0;i<9;i++)
        for(j=0;j<9;j++)
        {
            array[i][j]=0;
            outputArray[i][j]=0;
        }
        switch(poziom)
        {
            case 1: ile_losowac = 41;
                break;
            case 2: ile_losowac = 36;
                break;
            case 3: ile_losowac = 28;
                break;
            default : goto poczatek;
        }
        czySieZgadza = 0;
        while( czySieZgadza <=ile_losowac)
        {
            int wiersz = rand()%9;
            int kolumna = rand()%9;
            if (array[wiersz][kolumna] == 0)
            {
               array[wiersz][kolumna] = 1;
               czySieZgadza++;
            }
        }

        for (i = 0; i < 9; i++)
        for (j = 0; j < 9; j++)
        {
            if (array[i][j] == 1)
            {
                outputArray[i][j]=rand()%9+1;
            }
        }

        if (backtrack(0,0)){
            for (i = 0; i < 9; i++){
            for (j = 0; j < 9; j++)
            {
               cout <<outputArray[i][j];
            //ladne wypisanie
            if(j==2 || j==5) cout<<"| ";
            if(i==2 && j==8 || i==5 && j==8) cout<<"\n- - - - - - - ";
            }
            cout<<"\n";
            };
        }else
            goto generowanie;

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1