Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Sudoku (jak zwykle działa nie tak jak należy)

Ostatnio zmodyfikowano 2010-12-19 17:17
Autor Wiadomość
Carlosss
Temat założony przez niniejszego użytkownika
Sudoku (jak zwykle działa nie tak jak należy)
» 2010-12-18 20:38:39
Kod:

C/C++
#include <iostream>
#include <conio.h>
using namespace std;
int wylos_liczba[ 9 ][ 9 ];
bool czy_zajete = false;
//float wynik[2];
void losowanie( int &, int & );
int sprawdzanieA( bool &, int &, int & ), sprawdzenieB( bool &, int &, int & ), sprawdzenie( bool &, int &, int & );
int main()
{
    int a, b;
    srand( time( 0 ) );
    for( a = 0; a < 9; a++ )
    {
        for( b = 0; b < 9; b++ )
        {
            losowanie( a, b );
            sprawdzanieA( czy_zajete, a, b );
            sprawdzenieB( czy_zajete, a, b );
            sprawdzenie( czy_zajete, a, b );
            if( czy_zajete == 1 )
            {
                int g = 1;
                for( g = 1; g < 10; g++ )
                {
                    wylos_liczba[ a ][ b ] = g;
                    sprawdzanieA( czy_zajete, a, b );
                    sprawdzenieB( czy_zajete, a, b );
                    sprawdzenie( czy_zajete, a, b );
                    if( czy_zajete == 0 )
                         g += 10;
                   
                }
            }
        }
    }
   
    cout << "Inicjalizacja liczb zakonczona pomyslnie\n";
    for( int i = 0; i < 9; i++ )
    {
        for( int j = 0; j < 9; j++ )
        {
            cout << wylos_liczba[ i ][ j ] << "  ";
        }
        cout << endl << endl;
    }
    getch();
}

void losowanie( int & a, int & b )
{
    wylos_liczba[ a ][ b ] = 1 + rand() %( 10 - 1 );
}

int sprawdzanieA( bool & czy, int & a, int & b ) //
{
   
   
    for( int i = 0; i < a; i++ )
    {
        if( wylos_liczba[ a ][ b ] == wylos_liczba[ i ][ b ] )
             czy = true;
       
    }
    for( int i = a; i < 9; i++ )
    {
        if( wylos_liczba[ a ][ b ] == wylos_liczba[ i ][ b ] )
             czy = true;
       
    }
}
int sprawdzenieB( bool & czy, int & a, int & b ) //
{
   
    for( int i = 0; i < b; i++ )
    {
        if( wylos_liczba[ a ][ b ] == wylos_liczba[ a ][ i ] )
             czy = true;
       
    }
    for( int i = b; i < 9; i++ )
    {
        if( wylos_liczba[ a ][ b ] == wylos_liczba[ a ][ i ] )
             czy = true;
       
    }
}
int sprawdzenie( bool & czy, int & a, int & b )
{
    //********************zmienne*************
   
    int msc_krata, msc_kratb;
    int n = a + 1, m = a - 1, p = b + 1, o = b - 1;
   
    //*******************koniec zmiennych*****
    if( a == 0 || a == 3 || a == 6 )
         msc_krata = 1;
    else if( a == 1 || a == 4 || a == 7 )
         msc_krata = 2;
    else if( a == 2 || a == 5 || a == 8 )
         msc_krata = 3;
   
    if( b == 0 || b == 3 || b == 6 )
         msc_kratb = 1;
    else if( b == 1 || b == 4 || b == 7 )
         msc_kratb = 2;
    else if( b == 2 || b == 5 || b == 8 )
         msc_kratb = 3;
   
    if( msc_krata == 1 && msc_kratb == 1 ) // krata=1 kratb=1
    {
        if( wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ p + 1 ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n + 1 ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n + 1 ][ p + 1 ] )
             czy = true;
       
    }
    else if( msc_krata == 1 && msc_kratb == 2 ) // krata=1 kratb=2
    {
        if( wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n + 1 ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n + 1 ][ 0 ] )
             czy = true;
       
    }
    else if( msc_krata == 1 && msc_kratb == 3 )
    {
        if( wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ o - 1 ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n + 1 ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n + 1 ][ o - 1 ] )
             czy = true;
       
    }
    else if( msc_krata == 2 && msc_kratb == 1 )
    {
        if( wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ p + 1 ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ p + 1 ] )
             czy = true;
       
    }
    else if( msc_krata == 3 && msc_kratb == 1 )
    {
        if( wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m - 1 ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ p + 1 ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m - 1 ][ p + 1 ] )
             czy = true;
       
    }
    else if( msc_krata == 2 && msc_kratb == 2 )
    {
        if( wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ p ] )
             czy = true;
       
    }
    else if( msc_krata == 2 && msc_kratb == 3 )
    {
        if( wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ o - 1 ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ o - 1 ] )
             czy = true;
       
    }
    else if( msc_krata == 3 && msc_kratb == 2 )
    {
        if( wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m - 1 ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m - 1 ][ o ] )
             czy = true;
       
    }
    else if( msc_krata == 3 && msc_kratb == 3 )
    {
        if( wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ o - 1 ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m - 1 ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m - 1 ][ o - 1 ] )
             czy = true;
       
    }
}



Po uruchomieniu zamiast 81 losowych cyfr z zakresu 1-9 pasujących w kolumnach poziomych pionowych i kratkach 3x3 mam 1 losową cyfrę i osiemdziesiąt dziewiątek. Znając życie jest to jakiś banalny problem który spowodowany był moim niedouczeniem. Dlatego jeśli ktoś byłby tak miły by mi wskazać ten problem byłbym mu oczywiście dozgonnie wdzięczny... I jak dałoby się skrócić zapis w funkcji "sprawdzenie".
pozdROWienia

//EDIT: Kod został lekko zmodyfikowany estetycznie wg. waszych rad
P-25319
malan
» 2010-12-18 20:56:02
Może najpierw powiedz, co chcesz osiągnąć, bo patrząc na kod, to wydaje mi się, że chcesz wylosować 9 liczb z zakresu {1,...,9}, które nie będą się powtarzały w "poziomie", tak?
Czyli np.
1 5 9 4 3 8 2 6 7

Tylko nie rozumiem, po co tyle kodu...
P-25320
Carlosss
Temat założony przez niniejszego użytkownika
» 2010-12-18 21:19:32
Widzę że nigdy nie spotkałeś się z nazwą sudoku. To jest tzw "czysta forma inteligencji" tak pisze na okładce "100 sudoku". Moja aplikacja ma na celu wygenerować przykładową tabelką sudoku 9x9 a na tej tabelce 9 mniejszych tabelek 3x3. Cyfry w tabelce nie mogą sie powtarzać poziomo, pionowo i w kratce 3x3 (to mniej wiecej sudoku)... Więcej info w google
http://t2.gstatic.com/images?q=tbn:BRcWlSPSsg-DXM:http://s1.blomedia.pl/gadzetomania.pl/images/2010/11/Sudoku.gif&t=1
P-25322
malan
» 2010-12-18 22:02:13
Spotkałem się z nazwą Sudoku :). Nawet kiedyś je rozwiązywałem, wiesz? :)
Zobaczyłem funkcję losowanie i za bardzo się na tym skupiłem ;p. Zapomniałem kompletnie, że temat tyczy się Sudoku.

Co do tematu, to nie mogę się odnaleźć w Twoim kodzie... Za dużo zmiennych globalnych... ;p.
Np.
p = b + 1;
- do czego ci ta zmienna, która równa jest w całym programie jeden(1)?
P-25324
ison
» 2010-12-18 22:05:29
jeśli prawie zmienne których używasz do iteracji w for'ach deklarujesz globalnie to kod staje się mało czytelny, jeśli chcesz już koniecznie deklarować zmienne globalnie to nazywaj je sensownie
P-25325
Carlosss
Temat założony przez niniejszego użytkownika
» 2010-12-18 22:13:16
Czemu uważasz że w całym programie p=1? Możesz powiedzieć dlaczego?
P-25326
ison
» 2010-12-18 22:17:20
bo podstawiasz tylko jednorazowo
zapis
int a = b + 1;

nie oznacza że w całym programie zawsze zmienna a będzie większa od b o 1
P-25327
VND
» 2010-12-19 02:22:50
Usuń srand() poza funkcję losującą, najlepiej tak aby wykonała się tylko raz.
W sytuacji jaką masz teraz wylosowana liczba będzie się zmieniać dopiero co sekundę.
P-25329
« 1 » 2
  Strona 1 z 2 Następna strona