banjalukaforum.com
https://banjalukaforum.com/

Sudoku
https://banjalukaforum.com/viewtopic.php?f=18&t=14791
Stranica 1 od 1

Autoru:  che.guevara [ 12 Jul 2005, 17:53 ]
Tema posta:  Sudoku

Ej ljudi, bash sam odlijepio ove godine, sve mi se neshto radi.

Evo imam sad jedan program za rijeshavanje sudoku tabela. Radi u konzoli a upravo pravim interfejs - u pajtonu koristeci GTK. Ali postho to nece raditi nacisto pod windowsom, dajem vam source kod algoritma koji rijeshava sudoku.

Radjen je u C++ uz koristenje nekih sablona STL 'a.
PS: Najvishe me na pisanje programa potstakla vec postojeca verzija GNUDoku 0.9 koja nece da se kompajlira na mom racunaru :( Inace, sav kod ovdje je moj i koristenje je slobodno "dok ne stoji moj copyright" :D
Kod:
#include <iostream>
#include <algorithm>
#include <iterator>
#include <queue>
#include <set>

#define sudoku_t int

using namespace std;

class CSudoku
{
    private:
        sudoku_t m_table[3][3][3][3];
        set<sudoku_t> m_cant[3][3][3][3];       

    public:
        CSudoku(istream& in);
       
        void            set_p_table(int i, int j, sudoku_t t);
        sudoku_t&       p_table(int i, int j) { return m_table[i/3][j/3][i%3][j%3]; };
        set<sudoku_t>&  p_cant (int i, int j) { return m_cant[i/3][j/3][i%3][j%3]; };
        bool            solve(int progres);
   
};

CSudoku::CSudoku(istream& fin)
{
    sudoku_t t;
    for (int i=0; i<9; i++) {
        for (int j=0; j<9; j++)
        {
            fin>>t;
            if (t<0 || t>9) {
                cout<<"Nepravilan SU-DO-KU format fajla :("<<endl;
                cout<<"Ucitana vrijednost je: "<<t<<" a dozvoljeni su brojevi od 0-9"<<endl;
                exit(-2);
            }
           
            set_p_table(i,j,t); 
        }
    }
}

void CSudoku::set_p_table(int i, int j, sudoku_t t) {
    int bigi = i/3;
    int bigj = j/3;
    int smai = i%3;
    int smaj = j%3;
   
    m_table[bigi][bigj][smai][smaj] = t;
    if (t == 0)
        return;
           
    for (int ii=0; ii<9; ii++)
    {   // postavljanje uspravno i vodoravno
        if (ii != i) {
            set<int>& g = p_cant(ii,j);
            g.insert(t);
        }
       
        if (ii != j) {
            set<int>& g = p_cant(i,ii);
            g.insert(t);
        }
    }
    // postavljanje kocke
    for (int ii=0; ii<3; ii++)
        for (int jj=0; jj<3; jj++)
            if (ii!=smai && jj!=smaj)
                m_cant[bigi][bigj][ii][jj].insert(t);
}

ostream& operator<<(ostream& os, CSudoku& s ) {
    os<<"------------------"<<endl;
    for (int i=0; i<9; i++, os<<endl)
        for (int j=0; j<9; j++)
            os<<s.p_table(i,j)<<" ";
   
    os<<"------------------";
    return os;
}

bool CSudoku::solve(int progres) {
    int fi = progres/9;
    int fj = progres%9;
   
    //cout<<*this<<endl;
   
    for (int i=fi; i<9; i++) {
        int j;
        if (i==fi)
            j=fj;
        else
            j=0;
        for(; j<9; j++) {
            if (p_table(i,j) == 0) {
                // NASHAO SAM PRAZNO POLJE:
                // URADITI ITERACIJE
                int child_progres = i*9+j;           
                set<sudoku_t>& cant = p_cant(i,j);
               
                for (int m=1; m<=9; m++) {
                    if (cant.find(m) == cant.end()) {
                        CSudoku child(*this);
                        child_progres;
                        child.set_p_table(i,j,m);
                        if (child.solve(child_progres)) {
                            *this = child;
                            return true;   
                        } else {
                            continue;   // slijedeci m broj
                        }
                    }
                }
                // ne moze niti jedan broj
                return false;
            }
        }
    }
    return true;
}

void print_help() {
    cout<<"\tProgram koristi samo stdin i stdout."<<endl;
    cout<<"\tPrimjer:"<<endl;
    cout<<"\t\t./sudoku < fajlsamapom.txt > rezultat.txt"<<endl;
    cout<<endl;
    cout<<"\tOvu poruku mozete vidjeti ako pokrenete"<<endl;
    cout<<"\t\t./sudoku --help"<<endl;
    cout<<"\tMoguce je staviti --silent kao argument, onda program"<<endl;
    cout<<"\tispisuje *samo* rijeshenje, ovo koristi supyku program"<<endl;
    cout<<endl;
    cout<<"\tDakle, koristite redirekciju za rad sa fajlovima"<<endl;
    cout<<"\tProgram inace ne uzima argumente, osim ako ga ne poziva"<<endl;
    cout<<"\tsupyku program (interfejs uradjen u pygtk za linux, odnosno"<<endl;
    cout<<"\tu vb-u za windows)."<<endl;
}

int main(int argc, char** argv)
{
    bool silent = false;    // da li ispisuje 'proces'
    if (argc==1) {
        // nema argumenata ? valjda koristenje iz konzole
    } else if (argc==2) {
        string arg = string(argv[1]);
        if (arg == "--silent")
            silent = true;
        else if (arg == "--help") {
            print_help();
            return -1;
        } else {
            print_help();
            return -3;
        }
    } else {
        print_help();
        return -2;
    }
   
    CSudoku sudo(cin);
    if (!silent)
        cout<<sudo<<endl<<"Iteracija u toku ..."<<endl;

    if (sudo.solve(0)) {
        if (!silent)
            cout<<"Rijeshenje:"<<endl;
       
        cout<<sudo<<endl;
    } else {
        if (!silent)
            cout<<"Nema rijeshenja :/ :( :P :O"<<endl;
        return 1;
    }   
    //sudo.print_cant(cout);
    if (!silent)   
        cout<<"\tKraj, (C) che.guevara"<<endl;
    return 0;
}


Autoru:  Vertygo [ 12 Jul 2005, 20:16 ]
Tema posta: 

mmm sudoku je neka vrsta igrice ? ;)

Autoru:  Motoko Kusanagi [ 12 Jul 2005, 21:30 ]
Tema posta: 

Sudoku, logička igra gde imaš tabelu od 9x9 polja organizovanih u 3x3 kvadrate. Ukupno 9 3x3 kvadrata. Tabela je već popunjena sa nekim brojevima i ti trebaš na osnovu tih već unesenih da popuniš ostatak tabele. Pravila su ta da svaki 3x3 kvadrat mora da sadrži bojeve od 1 do 9, pri čemu isto važi i za svaki od 9 redova i kolona tj. svaki red i svaka kolona mora da sadrži brojeve od 1 do 9. Ovako izgleda jedna popunjena tabela
Slika
Koliko znam, svake nedelje izlazi nova tabela u Politici, gde objavljuju onoga ko prvi pošalje rešenje iz prošlog broja.

Autoru:  che.guevara [ 12 Jul 2005, 22:12 ]
Tema posta: 

Da, izlazi u politici, a znam da je jedan penzioner dobio dvd player :/
Normalno, skontali su i oni odskora da im "pametnjakovici" (ljudi koji koriste linux mogu da instaliraju GNUDoku) shalju rijeshenja cim kupe novine, dakle koriste racunar, pa su zbog toga prekinuli da shalju nagrade onima koji prvi poshalju.

Sad rade ovako, poslije 15:00h primaju se SMS i email poruke i ko prvi poshalje = dobija nagradu ... Dakle, nemojte da se zaludjujete, ovaj program je samo u "naucne" svrhe :)

PS: Gui za python je maltene skroz gotov i postavio bih pitanje upucenim, kako generisati novu sudoku tabelu? Koji broj brojeva je potreban da bih bio siguran da postoji samo jedno rijeshenje? Mislim da bih ovo i sam mogao da skontam, ali evo da pitam, ako neko zna vec? Dakle, imam algotiram za rijeshavanje, imam gui, sad mi josh samo treba algoritam za generisanje i mogu da prodajem program za 10$ :) :) :) Besplatno za prijatelje sa foruma, naravno.

Autoru:  Slash [ 13 Jul 2005, 19:16 ]
Tema posta: 

A koliko brojeva vec bude uneseno?
@che... cini mi se (jer prvi put cujem za ovu igru) da je mnogo laske napisati algoritam za rjesavanje nego za generisanje, jer ima velik broj kombinacija.

Autoru:  che.guevara [ 13 Jul 2005, 20:31 ]
Tema posta: 

Slash je napisao:
A koliko brojeva vec bude uneseno?
@che... cini mi se (jer prvi put cujem za ovu igru) da je mnogo laske napisati algoritam za rjesavanje nego za generisanje, jer ima velik broj kombinacija.

:lol:

Ma jok, odakle ti ta ideja?
Prvo se raspitaj malo i igri :)

Evo zavrshena je, mozete je naci na mom sajtu:


http://toroman.objectis.net/dirzabava/source.zip

Btw, ta verzija sadrzi source + algoritam kompajliran za linux (+20KB)
Medjutim, ako zelite da igrate na windowsu, a nemate mingw ili g++ kompajler, onda skinite ovaj zip i ekstraktujte ga u folder u kojem ste prethodno extraktovali igru.

http://toroman.objectis.net/dirzabava/windows.zip

Da podsjetim, pokrenite SyPyKy.py fajl a ne .exe ili nestho trece. Komentari? Btw, igra je josh uvijek u razvoju (nemam generator, nije mi se dalo da ga pravim, ali interfejs je ok i rijeshavanje solidno radi).

Autoru:  che.guevara [ 18 Jul 2005, 21:06 ]
Tema posta: 

Samo da kažem da sam konačno testirao igru i na windowsu, nakon što sam skinuo 10 MB gtk 2.6.8 sa ovog linka:

http://switch.dl.sourceforge.net/source ... .8-rc1.exe

Odlično radi i pod windowsom, dakle, gogo ;)

PS:

Sve o ovom projektu od sada pa ubuduće:

http://toroman.objectis.net/dirzabava/sypyky/

Autoru:  che.guevara [ 26 Jul 2005, 23:33 ]
Tema posta: 

Release novih verzija od sada na sourceforge portalu !!!

http://sourceforge.net/projects/sypyky/

Za sada, ništa novo. Nova verzija postoji, ali nije još uvijek uploadovana:

Novosti :
- sada je sve u pythonu
- opcionalno, program se može ubrzati skidanjem binarnog programa za algoritam
- dodao sam jednostavan generator
- program provjerava vaš unos (i prijavljuje greške)

Autoru:  Frenki [ 12 Avg 2005, 23:52 ]
Tema posta: 

vidim da sve kacis na strane stranice ,a jesi razmisljao da napravis licno svoju stranicu ,pa makar neki free server posto je kod nas tesko naci sponzora ...

Autoru:  che.guevara [ 13 Avg 2005, 12:12 ]
Tema posta: 

Ma jok, meni je znalac.tk sasvim dovoljan. Ali ovo sa sourceforgeom otpada jer imam problema sa CVS'om pod windowsom a pod linuxom ide previše sporo (tj ne ide otkako sam reinstalirao deb) ...

Tako da će nove verzije ipak biti postavljane na znalcu. Evo baš ću ovih dana da okačim jednu. Malo poboljšanu ;)

Autoru:  Utopija [ 23 Avg 2005, 07:48 ]
Tema posta: 

Ja sam se bas zarazio tom igrom, otvorio sam temu na podforumu zabava, onako uopsteno o sudokuu. Ja sam ipak za verziju da je "lomim" sa svojom glavom. Oni u Politici nekad znaju preterati, mislim ko ima sat vremena dnevno da resava zadatak. (doduse trenutno ja imam) hehe :oops: :oops: :oops: :lol: :lol: :lol:
Btw Che koliko je velik program, posto mi se nije dalo da otvaram linkove. oooopps :oops: :oops: :lol: 8) :D 8)

Autoru:  che.guevara [ 25 Avg 2005, 01:25 ]
Tema posta: 

Pa ... za tebe vjerovatno jeste velik. Imash fino uputstvo kako instalirati sve na linku ... Mislim za prosjecnog korisnika GTK+Python moze preci 20MB dok vecina linux korisnika to vec ima tako da im izadje oko 80KB downloada :)

Autoru:  Utopija [ 25 Avg 2005, 06:57 ]
Tema posta: 

To je ipak preveliko, tnx u svakom slucaju. poz sudoku fan-ovima. :D 8)

Autoru:  che.guevara [ 25 Avg 2005, 17:05 ]
Tema posta: 

Utopija je napisao:
To je ipak preveliko, tnx u svakom slucaju. poz sudoku fan-ovima. :D 8)


Jao dobro si me podsjetio sad, pa rekao sam da cu napraviti jedan u VisualBasicu samo za windows ... :/ Taj ce biti malen, oko 100KB ;)

Autoru:  Utopija [ 26 Avg 2005, 06:47 ]
Tema posta: 

E pa nemoj zaboraviti da nas obavestis. super :D :D :D 8)

Autoru:  che.guevara [ 04 Okt 2005, 22:35 ]
Tema posta: 

Hm steta, ali wind*ws mi je pokvaren vec nekoliko dana i uopste mi nije zanimljivo da programiram za gore p*menuti sist*m :cry:

Sta cesh ... krizzza.

Autoru:  Utopija [ 05 Okt 2005, 11:47 ]
Tema posta: 

Ma ko ceka taj doceka. :D 8)

Stranica 1 od 1 Sva vremena su u UTC [ DST ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/