Sudoku çözen program / C++

Başlatan ozdemir08, 10 Ağustos 2010 - 17:32:13

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

ozdemir08

Sudoku çözen program. Sizin tek yapmanız gereken 9x9 luk sudoku matrisini sudoku.in dosyasına yazmak. Bulunması gereken sayıların yerine 0 yazmanız gerekiyor.

/*
    Mehmet OZDEMIR
*/
#include<iostream>
#include<fstream>
#include<cstdlib>
#define FOR(i,j,k) for(i=j;i<k;i++)
using namespace std;
int A[10][10];
int satir[10][10],sutun[10][10],kare[10][10];
int sifir[82][2];
int sifir_sayisi;
void veri_oku()
{
            int i,j,gecici;
            ifstream r("sudoku.in");
            FOR(i,0,9)
                FOR(j,0,9)
                {
                    r>>A[i][j];
                    if(!A[i][j])
                    {
                        sifir[sifir_sayisi][0]=i;
                        sifir[sifir_sayisi++][1]=j;
                    }
                    else
                    {
                            gecici=A[i][j];
                            satir[i][gecici]=1;
                            sutun[j][gecici]=1;
                            kare[i/3*3+(j+3)/3][gecici]=1;
                    }

                }
            r.close();
}
void yaz()
{
        int i,j;
        FOR(i,0,9)
        {
            FOR(j,0,9)
                cout<<A[i][j]<<' ';
            cout<<endl;
        }
        exit(0);
}
void ekle(int i,int j,int a)
{
        A[i][j]=a;
        satir[i][a]=1;
        sutun[j][a]=1;
        kare[i/3*3+(j+3)/3][a]=1;
}
void cikar(int i,int j,int a)
{
        A[i][j]=0;
        satir[i][a]=0;
        sutun[j][a]=0;
        kare[i/3*3+(j+3)/3][a]=0;
}
void yap(int yer)
{
        if(yer==sifir_sayisi) yaz();
        int i=sifir[yer][0],j=sifir[yer][1],a;
        FOR(a,1,10)
            if(!satir[i][a] && !sutun[j][a] && !kare[i/3*3+(j+3)/3][a])
            {
                    ekle(i,j,a);
                    yap(yer+1);
                    cikar(i,j,a);
            }
}
main()
{
        veri_oku();
        yap(0);
}

sudoku.in dosyası buna benzer olmalı.

4 0 7 0 0 2 9 0 0
8 0 0 0 3 0 0 2 0
0 5 0 8 9 0 3 0 4
1 8 0 7 0 5 6 0 2
0 0 0 1 0 0 0 0 0
7 4 0 2 0 0 8 0 1
0 1 0 5 7 0 0 0 0
0 2 8 0 0 4 7 0 5
5 0 0 9 0 0 1 4 0


Anlamadığınız yer olursa cevaplayabilirim.

sem

Alıntı Yapsem0900@laptop:~$ g++ sudoku.c -o sudoku
sem0900@laptop:~$ ./sudoku
4 3 7 6 5 2 9 1 8
8 9 1 4 3 7 5 2 6
6 5 2 8 9 1 3 7 4
1 8 3 7 4 5 6 9 2
2 6 5 1 8 9 4 3 7
7 4 9 2 6 3 8 5 1
3 1 4 5 7 6 2 8 9
9 2 8 3 1 4 7 6 5
5 7 6 9 2 8 1 4 3
sem0900@laptop:~$ cat sudoku.in
4 0 7 0 0 2 9 0 0
8 0 0 0 3 0 0 2 0
0 5 0 8 9 0 3 0 4
1 8 0 7 0 5 6 0 2
0 0 0 1 0 0 0 0 0
7 4 0 2 0 0 8 0 1
0 1 0 5 7 0 0 0 0
0 2 8 0 0 4 7 0 5
5 0 0 9 0 0 1 4 0


Adımı yazdırmam ile aynı hızda çözüyor sudokuyu... Vaktim olunca kodu inceleyebilmek isterim... Çok falza hızlı...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

canosayan

algoritma olarak olsa çok süper olur. gerçi c kolay okunabilen bir dil ama belki php halini yazabilirim.
Chmod bizim işimiz.

ozdemir08

Alıntı yapılan: canosayan - 08 Kasım 2010 - 13:05:41
algoritma olarak olsa çok süper olur. gerçi c kolay okunabilen bir dil ama belki php halini yazabilirim.

Aslında çok karmaşık bir algoritması yok. Eğer recursion olayını biliyorsan çok rahat yazabileceğin bir kod. Müsait bir zamanda ayrıntılı bir şekilde anlatırım.

rick

Çok güzel. Hile yapmak için birebir. :D

canosayan

Chmod bizim işimiz.