Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C++ losowanie, sprawdzanie z innymi wylosowanymi

daedraedra 13 Cze 2010 20:57 1118 5
  • #1 13 Cze 2010 20:57
    daedraedra
    Poziom 2  

    Witam.
    Mam problem z tworzeniem generatora sudoku opartego na najprostszych funkcjach.
    Generator sprawdza, czy liczba nie powtórzyła się we wcześniejszych kostkach, ale nie potrafi sprawdzić czy w danej kostce już była wylosowana...
    Tak ponumerowane są tablice w całym sudoku po 9 danych każda
    1 2 3
    4 5 6
    7 8 9
    A tak dane w konkretnej tabeli
    0 1 2
    3 4 5
    6 7 8
    Kod na tabelę środkową:

    Code:

    //tab5
    cout<<endl<<"Czekaj, generuje tab5"<<endl;
    k=1;
    do{
       i=0;
       srand( (unsigned)time( NULL ) ); //generowanie miejsca 0 z 0do8
       tab5[0]=(rand()%9)+1;
       if ((tab5[i]==tab2[0])||(tab5[i]==tab2[3])||(tab5[i]==tab1[6])) //sprawdza z poprzedzającą kolumną tabeli 2
       {
            x=1;
       }
       else if ((tab5[i]==tab4[0])||(tab5[i]==tab4[1])||(tab5[i]==tab4[2])) //sprawdza z równoległym wierszem tabeli 4
       {
            x=1;
        }
       else
       {
            x=0;
       }
    }while(x!=0);
    x=0;
    cout<<endl<<tab5[0]<<" ";
    i=1;
    for (i=1;i<9;i++)
    {
       for (k=1;i-k+1>=0;k++)
       {
           do{
               srand( (unsigned)time( NULL ) );  //generowanie miejsc od 1 do 8 z 0-8 w pętli
               tab5[i]=(rand()%9)+1;
               if ((tab5[i]==tab4[i-(i%3)])||(tab5[i]==tab4[i-(i%3)+1])||(tab5[i]==tab4[i-(i%3)+2])) //sprawdza z równoległym wierszem tabeli 4
               {
                    x=1;
               }
               else if ((tab5[i]==tab2[(i%3)])||(tab5[i]==tab2[(i%3+3)])||(tab5[i]==tab2[(i%3+6)])) //sprawdza z powyższą kolumną tabeli 2
               {
                    x=1;
                }
    //----ta funkcja nie działa... nie mam pojęcia dlaczego----




               else if (1>0)
                    for (a=i-1; a<0; a--)
                    {
                        if (tab5[i]=tab5[a])
                        {
                            x=1;
                        }
                        else
                        {
                            x=0;
                        }
                    }
    //----dotąd----
               else
               {
                   x=0;
               }
           }while(x!=0);
            x=0;
       }
       if (i%3==2)
        {
            cout<<tab5[i]<<endl;
        }
        else
        {
            cout<<tab5[i]<<" ";
        }
    }

    x=1 oznacza błąd
    x=0 oznacza brak błędu

    Ktokolwiek mógłby pomóc? Używałem już 3 różnych sposobów na sprawdzanie komórki z wcześniejszymi wylosowanymi w tabeli i żadna nie zadziałała... O dziwo tabela 1 zawsze działa

    Dodano po 2 [godziny] 13 [minuty]:

    Ktokolwiek?
    Proooszę?

    0 5
  • #2 13 Cze 2010 21:54
    gaskoin
    Poziom 38  

    ja bym zrobił to tak: (mając jedną tablicę 9x9 w której mam wszystkie liczby)

    tablica niech nazywa sie sudoku[9][9];

    Code:

    int mapa[10];
    bool blad = false;

    for(int i =0 ; i<10; i++){
            mapa[i] = 0;
    }

    for(int i = 0; i< 9; i=i+3){
            for(int j = 0; j < 9; j=j+3){
                    for(int k = 0; k < 3; k++){
                            for(int l = 0; l < 3; l++){
                                    ++mapa[sudoku[i+k][j+l]];
                            }
                    }

                    for(int k = 0; k < 10; k++){
                                    if(mapa[k]  > 1) blad = true;
                    }

    // zrobienie coś z błędem etc

            }
    }


    :) błąd może tez być tablicą - wtedy mógłbyś określać w których "kwadratach" znajduję się błąd. Pewnie da się optymalniej:) Mapę musisz oczywiście zerować po sprawdzeniu pierwszego kwadratu, gdyż w przeciwnym wypadku w drugim zawsze dostaniesz błąd

    0
  • #3 14 Cze 2010 01:18
    test30
    Poziom 10  

    daedraedra napisał:

    Code:

    //----ta funkcja nie działa... nie mam pojęcia dlaczego----
               else if (1>0)
                    for (a=i-1; a<0; a--)
                    {
                        if (tab5[i]=tab5[a])
                        {
                            x=1;
                        }
                        else
                        {
                            x=0;
                        }
                    }
    //----dotąd----

    jeśli nie możesz znaleźć błędu, to zapewne tzw. memory leak.
    Zastanówmy się jak działa for z (post)dekrementowaniem iteratora.
    analizując prostszy przykład:
    Code:
    #include<stdio.h> (...) for (int i=10; i>0; --i) printf("%d ",i)

    zauważ, że drugi argument for'a u mnie to iterator większy od 0 przy dekrementowaniu iteratora,
    u ciebie to jest iterator mniejszy od zera, tez przy dekrementowaniu.
    to sie ani razu nie wykonuje, bo petla bedzie wykonywana dopóki warunek (a<0) jest spełniony

    0
  • #4 14 Cze 2010 16:14
    daedraedra
    Poziom 2  

    Cytat:
    Zastanówmy się jak działa for z (post)dekrementowaniem iteratora.
    analizując prostszy przykład:
    Kod:
    #include<stdio.h> (...) for (int i=10; i>0; --i) printf("%d ",i)

    zauważ, że drugi argument for'a u mnie to iterator większy od 0 przy dekrementowaniu iteratora,
    u ciebie to jest iterator mniejszy od zera, tez przy dekrementowaniu.
    to sie ani razu nie wykonuje, bo petla bedzie wykonywana dopóki warunek (a<0) jest spełniony

    Ok, źle zrozumiałem informacje na ddt.pl... Jest tam napisane, że ustalenie "iterator'a" to "ustalenie warunku kończącego pętlę"... Zrozumiałem to w drugą stronę...

    Możesz mi wytłumaczyć na czym miałby tu polegać memory leak? Czy nazywasz tym terminem to, co opisałeś?[/quote]

    0
  • #5 14 Cze 2010 16:39
    test30
    Poziom 10  

    chyba napisalem to jakos nie majac wiekszych powodow, spojrzalem na ten kod i cos innego mi sie przedstawilo.
    zalozylem, ze ta petla sie wykonuje raz z argumentem a=-1, czyli tab5[-1], a to jest cos nieprzewidywalnego, to wlasnie bylby memory leak,
    np. jesli zrobisz:

    Code:
    char *wsk=new char[100]; 

    a pozniej odwolasz sie do wsk[200];
    to bedzie tragedia, juz nawet wsk[100] powoduje blad :P, tym bardziej wsk[-1],
    nie przejmuj sie tym co napisalem o memory leak, to jest w tym wypadku zle stwierdzenie, przepraszam :P na usprawiedliwienie moge tylko powiedziec godzine o ktorej pisalem odpowiedz na twoj problem

    zakladam, ze teraz jest juz dobrze, mam racje?

    0
  • #6 14 Cze 2010 20:58
    daedraedra
    Poziom 2  

    Tak, myślę, że masz. Niemniej skrypt zacina się już przy tabeli nr 2 czy 3... Chyba odpuszczę, nie mam siły na to... :/

    Dodano po 1 [godziny] 40 [minuty]:

    Dzięki wam obu za pomoc, ale w mojej koncepcji odnalazłem błędy logiczne... Piszę wszystko od nowa w nowy sposób.

    : )

    0