banjalukaforum.com

Dobrodošli na banjalukaforum.com
Danas je 18 Jul 2025, 21:34

Sva vremena su u UTC [ DST ]




Započni novu temu Odgovori na temu  [ 17 Posta ] 
Autoru Poruka
 Tema posta: Sudoku
PostPoslato: 12 Jul 2005, 17:53 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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;
}



Vrh
 Profil  
 
 Tema posta:
PostPoslato: 12 Jul 2005, 20:16 
OffLine
Majstorski kandidat
Majstorski kandidat
Korisnikov avatar

Pridružio se: 12 Jul 2001, 01:00
Postovi: 457
Lokacija: Banjaluka
mmm sudoku je neka vrsta igrice ? ;)

_________________
Ivan M.


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 12 Jul 2005, 21:30 
OffLine
Pripravnik
Pripravnik
Korisnikov avatar

Pridružio se: 16 Sep 2001, 01:00
Postovi: 270
Lokacija: Banja Luka
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.


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 12 Jul 2005, 22:12 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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.


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 13 Jul 2005, 19:16 
OffLine
Pripravnik
Pripravnik
Korisnikov avatar

Pridružio se: 19 Feb 2005, 00:07
Postovi: 193
Lokacija: Banja Luka
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.


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 13 Jul 2005, 20:31 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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).


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 18 Jul 2005, 21:06 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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/


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 26 Jul 2005, 23:33 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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)


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 12 Avg 2005, 23:52 
OffLine
Stara kuka
Stara kuka
Korisnikov avatar

Pridružio se: 22 Maj 2003, 18:55
Postovi: 4706
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 ...

_________________
http://www.codebluestudio.com


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 13 Avg 2005, 12:12 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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 ;)


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 23 Avg 2005, 07:48 
OffLine
Stara kuka
Stara kuka
Korisnikov avatar

Pridružio se: 17 Feb 2002, 01:00
Postovi: 4990
Lokacija: B.Luka
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)

_________________
Nature has fixed no limits on our hopes.


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 25 Avg 2005, 01:25 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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 :)


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 25 Avg 2005, 06:57 
OffLine
Stara kuka
Stara kuka
Korisnikov avatar

Pridružio se: 17 Feb 2002, 01:00
Postovi: 4990
Lokacija: B.Luka
To je ipak preveliko, tnx u svakom slucaju. poz sudoku fan-ovima. :D 8)

_________________
Nature has fixed no limits on our hopes.


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 25 Avg 2005, 17:05 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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 ;)


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 26 Avg 2005, 06:47 
OffLine
Stara kuka
Stara kuka
Korisnikov avatar

Pridružio se: 17 Feb 2002, 01:00
Postovi: 4990
Lokacija: B.Luka
E pa nemoj zaboraviti da nas obavestis. super :D :D :D 8)

_________________
Nature has fixed no limits on our hopes.


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 04 Okt 2005, 22:35 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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.


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 05 Okt 2005, 11:47 
OffLine
Stara kuka
Stara kuka
Korisnikov avatar

Pridružio se: 17 Feb 2002, 01:00
Postovi: 4990
Lokacija: B.Luka
Ma ko ceka taj doceka. :D 8)

_________________
Nature has fixed no limits on our hopes.


Vrh
 Profil  
 
Prikaži postove u poslednjih:  Poređaj po  
Započni novu temu Odgovori na temu  [ 17 Posta ] 

Sva vremena su u UTC [ DST ]


Ko je OnLine

Korisnici koji su trenutno na forumu: Nema registrovanih korisnika i 0 gostiju


Ne možete postavljati nove teme u ovom forumu
Ne možete odgovarati na teme u ovom forumu
Ne možete monjati vaše postove u ovom forumu
Ne možete brisati vaše postove u ovom forumu
Ne možete slati prikačene fajlove u ovom forumu

Pronađi:
Idi na:  
Powered by phpBB® Forum Software © phpBB Group
Hosting BitLab
Prevod - www.CyberCom.rs