Şimdi Ara

Sudoku çözen ve sudoku oluşturan uygulama yaptım :)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir (1 Mobil) - 1 Masaüstü1 Mobil
5 sn
15
Cevap
4
Favori
10.545
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Dün bir arkadaşımın C#'da yaptığını gördüm, hemen kolları sıvadım ve ben de java'da yaptım. O C#'da yaptığı için benden üstün olduğu taraflar vardı onu da biraz uğraşla hallettim.

    İlk olarak içerisini dolu kabul ettiğim 3 boyutlu bir dizi oluşturdum. Üç boyutlu tasarlamamın sebebi sudoku'da 9 kutucuk ve her kutucukta 3 satır, 3 sütun olması. Çözüm kodu aşağıda:

    HashMap<Integer, Integer> ihtimaller = new HashMap<Integer, Integer>(); 

    int dizi[][][] = new int[9][3][3];


    // Kutucuk seç
    for (int i = 0; i < 9; i++) {
    boolean B = false;

    // Kutucuk içinde Satır seç
    for (int j = 0; j < 3; j++) {

    // Kutucuk içinde Sütun seç
    for (int k = 0; k < 3; k++) {
    if (dizi[i][j][k] == 0) {

    for (int z = 1; z < 10; z++) {
    ihtimaller.put(z, z);
    }

    // Seçili kutu içindeki sayıları ihtimallerden çıkart
    for (int b = 0; b < 3; b++) {
    for (int c = 0; c < 3; c++) {
    ihtimaller.put(dizi[i][b][c], 0);
    }
    }

    // Seçili satırdaki sayıları ihtimallerden çıkart
    for (int a = (i / 3) * 3; a < (i / 3) * 3 + 3; a++) {
    for (int c = 0; c < 3; c++) {
    ihtimaller.put(dizi[a][j][c], 0);
    }
    }

    // Seçili sütundaki sayıları ihtimallerden çıkart
    for (int a = i % 3; a < (i % 3) + 7; a += 3) {
    for (int b = 0; b < 3; b++) {
    ihtimaller.put(dizi[a][b][k], 0);
    }
    }

    // Kaç ihtimal kaldığına bak
    int xCnt = 0;
    int xTemp = 0;
    for (int x = 1; x < 10; x++) {
    if (ihtimaller.containsValue(x)) {
    xCnt++;
    xTemp = x;
    }
    }

    // Bir ihtimal kaldıysa o sayıyı yerleştir ve döngüyü terket.
    if (xCnt == 1) {
    dizi[i][j][k] = xTemp;
    B = true;
    break;
    }
    }
    }
    //Kutu sayacını sıfırlayarak mevcut döngüyü teket.
    if (B) {
    i = -1;
    break;
    }
    }
    }


    Benim için asıl zor olan bu kodun neyi çözeceği oldu Çünkü her seferinde kodlarla sudokunun içini dolduramazdım. O yüzden NetBeans'te jFrame'e başvurdum. Aşağıdaki kod kalabalığı oraya ait. Kendi idenizde "SudokuCoz" adında yeni class açarak "package" hariç bütün satırlarını silerek ekteki text içindeki kodu yapıştırıp kullanabilirsiniz.

    sonuç:
     Sudoku çözen ve sudoku oluşturan uygulama yaptım :)



    edit: Program çalışmıyormuş, kimse de uyarmamış. Düzelttim, artık kendi ide'nize kodu yapıştırarak çalıştırabilirsiniz

    edit2: Artık bütün sudokuları çözebiliyor. Çözemediği sudoku olursa lütfen burada paylaşın

    Edit3: Sudoku oluşturma kodlarını bu mesaja ekleyemediğim için son mesajda verdim.



    < Bu mesaj bu kişi tarafından değiştirildi Guest -- 18 Temmuz 2012; 15:19:55 >







  • açıklama:

    dizi[9][3][3] biraz karışık olabilir resimle göstereyim:


     Sudoku çözen ve sudoku oluşturan uygulama yaptım :)
  • Şimdi hocam arrayimiz nasıl bir görüntü şu şekilde mi oluyor.
    Yani o kırmızılı 3 e 3 arrayden 9 tane art arda oluyor.Peki aynı satırda ve sütunda aynı rakamların gelmemesi için algoritma nedir yani sözlü olarak anlatabilir misiniz?

     Sudoku çözen ve sudoku oluşturan uygulama yaptım :)
  • 3 boyutu bu kadar kafanızda matematikselleştirmeyin. yoksa 4 veya 5 boyutlu diziyi kafamızın alması mümkün olmaz.

    aslında çok boyutluluk yoktur. sadece satır vardır. normalde her satırda bir nesne tutulur. yeni bir boyut ekleyince; örneğin 2 boyutlu bir dizi yapınca her satırında ayrı bir dizi tutulmuş olur. (dizi de bir nesnedir) boyut arttıkça bu derinleşir. yani dizi içinde her satırın içinde dizi, onun içinde de yine her satırın içinde dizi olması gibi (inseption gibi oldu biraz

    java'daki diziler bir telefonun menüleri gibidir. menü içinde başka bir menü olması gibi. örneğin telefonda ana menü'de 3 tane alt menü var. onların da herbiri içinde 4 tane alt menü var. en son alt menülerin içinde de 5'er tane uygulama var. bir uygulamaya ulaşmak isteyince en üstten alta doğru ilgili menüyü seçer ve ulaşırız. (bu benzetme [3][4][5] şeklinde tanımlanan 3 boyutlu bir diziye benzedi)

    java'yı bilen birisisin galiba ama yine de bunlardan bahsetme gereği duydum.

    [9][3][3] şeklinde tanımlanan dizide en son elemana ulaşmak için [i ][j][k] olarak adres belirttim.
    yani i: kutu numarası (ikinci mesajda gösterdiğim şekilde kutulara numara verdim. toplam 9 tane)
    j: satır
    k: sütun

    olacak şekilde tasarlandı.

    gelelim çözüm bulma mantığına,

    iç içe 'for'larla sırasıyla kutu, satır ve sütun numaralarını döndürerek her elemana tek tek ulaşıyoruz.

    her elemana ulaşınca ilk olarak 0'a eşit olup olmadığını sorguluyoruz. (içerisine değer yerleştirilmeyen hücreler varsayılan olarak 0'a dönüştürüldü)

    0'a eşitse önce 'ihtimaller' adında, içinde 1'den 9'a kadar sayıların olduğu bir dizi tanımlıyoruz.

    sonra bu elemanla aynı kutuda olan sayıları 'ihtimaller' dizisinden siliyoruz. ondan sonra aynı satırdaki elemanları, en son da aynı sütundaki elemanları ihtimallerden siliyoruz.

    son olarak, ihtimaller içinde eğer sadece 1 sayı kaldıysa seçili olan elemana bu sayıyı atıyoruz.

    eğer sayı atama işlemi olursa,
    bu durumda değer atanan eleman daha önce değer atanamayan elemanların hesaplanmasında etkili olacağı için en baştan tüm hücrelere bir daha bakmasını sağlıyoruz. bunun için i'yi -1 yapıyoruz böylece en dıştaki for'a döndüğü zaman değeri 1 artacak ve 0 olarak.(i=0; i<9; i++) yani döngü baştan başlayacak.



    < Bu mesaj bu kişi tarafından değiştirildi Guest -- 13 Temmuz 2012; 19:48:03 >
    < Bu ileti mobil sürüm kullanılarak atıldı >




  • quote:

    Orijinalden alıntı: A.F. ASLAN

    3 boyutu bu kadar kafanızda matematikselleştirmeyin. yoksa 4 veya 5 boyutlu diziyi kafamızın alması mümkün olmaz.

    aslında çok boyutluluk yoktur. sadece satır vardır. normalde her satırda bir nesne tutulur. yeni bir boyut ekleyince; örneğin 2 boyutlu bir dizi yapınca her satırında ayrı bir dizi tutulmuş olur. (dizi de bir nesnedir) boyut arttıkça bu derinleşir. yani dizi içinde her satırın içinde dizi, onun içinde de yine her satırın içinde dizi olması gibi (inseption gibi oldu biraz

    java'daki diziler bir telefonun menüleri gibidir. menü içinde başka bir menü olması gibi. örneğin telefonda ana menü'de 3 tane alt menü var. onların da herbiri içinde 4 tane alt menü var. en son alt menülerin içinde de 5'er tane uygulama var. bir uygulamaya ulaşmak isteyince en üstten alta doğru ilgili menüyü seçer ve ulaşırız. (bu benzetme [3][4][5] şeklinde tanımlanan 3 boyutlu bir diziye benzedi)

    java'yı bilen birisisin galiba ama yine de bunlardan bahsetme gereği duydum.

    [9][3][3] şeklinde tanımlanan dizide en son elemana ulaşmak için [j] [k] olarak adres belirttim.
    yani i: kutu numarası (ikinci mesajda gösterdiğim şekilde kutulara numara verdim. toplam 9 tane)
    j: satır
    k: sütun

    olacak şekilde tasarlandı.

    gelelim çözüm bulma mantığına,

    iç içe 'for'larla sırasıyla kutu, satır ve sütun numaralarını döndürerek her elemana tek tek ulaşıyoruz.

    her elemana ulaşınca ilk olarak 0'a eşit olup olmadığını sorguluyoruz. (içerisine değer yerleştirilmeyen hücreler varsayılan olarak 0'a dönüştürüldü)

    0'a eşitse önce 'ihtimaller' adında, içinde 1'den 9'a kadar sayıların olduğu bir dizi tanımlıyoruz.

    sonra bu elemanla aynı kutuda olan sayıları 'ihtimaller' dizisinden siliyoruz. ondan sonra aynı satırdaki elemanları, en son da aynı sütundaki elemanları ihtimallerden siliyoruz.

    son olarak, ihtimaller içinde eğer sadece 1 sayı kaldıysa seçili olan elemana bu sayıyı atıyoruz.

    eğer sayı atama işlemi olursa,
    bu durumda değer atanan eleman daha önce değer atanamayan elemanların hesaplanmasında etkili olacağı için en baştan tüm hücrelere bir daha bakmasını sağlıyoruz. bunun için i'yi -1 yapıyoruz böylece en dıştaki for'a döndüğü zaman değeri 1 artacak ve 0 olarak.(i=0; i<9; i++) yani döngü baştan başlayacak.

    Anlaşılmıştır sağolun.




  • bir kaç metot ekledim, artık daha zor seviyeli sudokuları çözebiliyor
  • en zor sudokuları çözebilecek bir metot ekledim.

    hata olursa lütfen söyleyin.
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • ekteki dosyada sudoku oluşturma kodlarını verdim.
  • beyler ben de c# ta sudoku yapmaya çalışıyorum ama oluşturma kısmında hata alıyorum yardım edebiliceğinizi düşündüm ben iki boyutlu dizi kullandım işte dizi[i, j] şeklinde i satır j sütun olmak üzere kutu kontrolünü de if else lerle yaptım i 3 ten küçük ve j 3 ten küçükse 1. kutu falan kutu kontrollerini o şekilde yaptım nerede hata yapıyorum bi el atın

    int[,] dizi = new int[9, 9];

    Random r = new Random();

    bool b;

    int sayac;

    private void Form1_Load(object sender, EventArgs e)
    {
    for (int i = 0; i < 9; i++)
    {
    sayac = 0;
    for (int j = 0; j < 9; j++)
    {
    int x = r.Next(1, 10);
    b = true;
    for (int m = 0; m < 9; m++)
    {
    if (x == dizi[i, m])
    {
    b = false;
    }
    }
    for (int n = 0; n < 9; n++)
    {
    if (x == dizi[n, j])
    {
    b = false;
    }
    }
    for (int g = 0; g < 9; g++)
    {
    for (int h = 0; h < 9; h++)
    {
    if (g < 3)
    {
    if (h < 3)
    {
    if (x == dizi[g, h])
    {
    b = false;
    }
    }
    else if (h >= 3 && h < 6)
    {
    if (x == dizi[g, h])
    {
    b = false;
    }
    }
    else
    {
    if (x == dizi[g, h])
    {
    b = false;
    }
    }
    }
    else if (g >= 3 && g < 6)
    {
    if (h < 3)
    {
    if (x == dizi[g, h])
    {
    b = false;
    }
    }
    else if (h >= 3 && h < 6)
    {
    if (x == dizi[g, h])
    {
    b = false;
    }
    }
    else
    {
    if (x == dizi[g, h])
    {
    b = false;
    }
    }
    }
    else
    {
    if (h < 3)
    {
    if (x == dizi[g, h])
    {
    b = false;
    }
    }
    else if (h >= 3 && h < 6)
    {
    if (x == dizi[g, h])
    {
    b = false;
    }
    }
    else
    {
    if (x == dizi[g, h])
    {
    b = false;
    }
    }
    }
    }
    }
    if (b)
    {
    dizi[i, j] = x;
    }
    else
    {
    sayac++;
    if (sayac>50)
    {
    i--;
    for (int p = 0; p < 9; p++)
    {
    dizi[i, p] = 0;
    }
    b = true;
    break;
    }
    else
    {
    j--;
    }
    }
    }
    }
    }




  • quote:

    Orijinalden alıntı: nifak5

    beyler ben de c# ta sudoku yapmaya çalışıyorum ama oluşturma kısmında hata alıyorum yardım edebiliceğinizi düşündüm ben iki boyutlu dizi kullandım işte dizi[i, j] şeklinde i satır j sütun olmak üzere kutu kontrolünü de if else lerle yaptım i 3 ten küçük ve j 3 ten küçükse 1. kutu falan kutu kontrollerini o şekilde yaptım nerede hata yapıyorum bi el atın


    konuyu da algoritmayı da unutmuştum hortlamış
    kod olarak yardım istiyorsan java bölümü yerine c#'la ilgilenen arkadaşlardan yardım istesen daha doğru olur. algoritma soruyorsan önce benim kendi kodlarımı anlamam için biraz zamana ihtiyacım var

    hatırladığım kadarıyla yardımcı olmaya çalışayım. benim çözüm mantığımla 2 boyutlu diziyle yapmak mümkün ama biraz karışık. resim üzerinde gösterirsem:

     Sudoku çözen ve sudoku oluşturan uygulama yaptım :)

    -9 kutu ve her kutuda 3 satır, 3 sütun var.

    -önce ihtimaller diye bir dizi olacak ve bu dizide 1'den 9'a kadar sayılar olacak.

    - sudoku üzerinde sırayla boş hücreler seçilecek.

    -Seçilen hücreyle aynı kutuda olan sayılar ihtimaller dizisinden çıkarılacak. Sonra aynı satırdaki hücrelere bakılacak ve bu satırdaki sayılar da diziden çıkarılacak. Sonra aynı sütundaki sayılar da diziden çıkarılacak.

    -eğer ihtimaller dizisinde sadece 1 tane sayı kaldıysa seçtiğimiz hücreye bu sayıyı atıyoruz.

    -Eğer birden fazla sayı kaldıysa hiçbirşey yapmadan başka hücreye geçiyoruz.

    -Bir sayı bulduğumuz zaman bütün sayaçları sıfırlayıp baştan başlatıyoruz çünkü bulunan bir sayı başka bir hücrenin çözümü olabilir.
    ---

    umarım yardımcı olmuştur. kutu, satır ve sütunlarda sırayla eleman seçmek için matematiksel bir denklem yazmak gerekiyor. eğer bulamazsan ona da yardımcı olurum.



    < Bu mesaj bu kişi tarafından değiştirildi Guest -- 5 Şubat 2013; 10:23:14 >




  • quote:

    Orijinalden alıntı: A.F. ASLAN

    quote:

    Orijinalden alıntı: nifak5

    beyler ben de c# ta sudoku yapmaya çalışıyorum ama oluşturma kısmında hata alıyorum yardım edebiliceğinizi düşündüm ben iki boyutlu dizi kullandım işte dizi[i, j] şeklinde i satır j sütun olmak üzere kutu kontrolünü de if else lerle yaptım i 3 ten küçük ve j 3 ten küçükse 1. kutu falan kutu kontrollerini o şekilde yaptım nerede hata yapıyorum bi el atın


    konuyu da algoritmayı da unutmuştum hortlamış
    kod olarak yardım istiyorsan java bölümü yerine c#'la ilgilenen arkadaşlardan yardım istesen daha doğru olur. algoritma soruyorsan önce benim kendi kodlarımı anlamam için biraz zamana ihtiyacım var

    hatırladığım kadarıyla yardımcı olmaya çalışayım. benim çözüm mantığımla 2 boyutlu diziyle yapmak mümkün ama biraz karışık. resim üzerinde gösterirsem:

     Sudoku çözen ve sudoku oluşturan uygulama yaptım :)

    -9 kutu ve her kutuda 3 satır, 3 sütun var.

    -önce ihtimaller diye bir dizi olacak ve bu dizide 1'den 9'a kadar sayılar olacak.

    - sudoku üzerinde sırayla boş hücreler seçilecek.

    -Seçilen hücreyle aynı kutuda olan sayılar ihtimaller dizisinden çıkarılacak. Sonra aynı satırdaki hücrelere bakılacak ve bu satırdaki sayılar da diziden çıkarılacak. Sonra aynı sütundaki sayılar da diziden çıkarılacak.

    -eğer ihtimaller dizisinde sadece 1 tane sayı kaldıysa seçtiğimiz hücreye bu sayıyı atıyoruz.

    -Eğer birden fazla sayı kaldıysa hiçbirşey yapmadan başka hücreye geçiyoruz.

    -Bir sayı bulduğumuz zaman bütün sayaçları sıfırlayıp baştan başlatıyoruz çünkü bulunan bir sayı başka bir hücrenin çözümü olabilir.
    ---

    umarım yardımcı olmuştur. kutu, satır ve sütunlarda sırayla eleman seçmek için matematiksel bir denklem yazmak gerekiyor. eğer bulamazsan ona da yardımcı olurum.

    yanlış anlamışsın ben evet algoritmasını sordum ama çözen programın değil oluşturmayı sordum




  • quote:

    Orijinalden alıntı: nifak5

    yanlış anlamışsın ben evet algoritmasını sordum ama çözen programın değil oluşturmayı sordum

    çözmeyi yapabildin mi? çünkü bunda hata almıyorsan aynı şeyi tersten işleterek çözüm bulabilirsin.

    benim yazdığım kodda 3 ayrı çözüm metodu vardı. senin de kendine göre farklı çözüm metodun olabilir.

    -önce class içerisinde bir tane çözüm metodu yazmalısın. bunun adı da "cozum()" olsun.

    -sudoku içerisinde rastgele bir nokta seçilecek ve bu noktanın dolu veya boş olduğu kontrol edilecek.
    -eğer seçilen hücre boşsa 1'den 9'a kadar rastgele bir sayı üretilecek.
    -üretilen sayının sudoku kurallarına uygunluğu kontrol edilecek yani aynı kutu, satır veya sütunda bu sayıdan varsa yeni sayı üretilecek.
    -üretilen sayı seçilen hücreye atanacak.


    -her bir sayı atama işleminden sonra cozum() metodu çalıştırılarak sudokunun çözülebilirliği kontrol edilecek.
    -eğer çözülebiliyorsa artık yeni sayı üretilmeyecek ve sudoku son halini almış olacak.




  • quote:

    Orijinalden alıntı: A.F. ASLAN

    quote:

    Orijinalden alıntı: nifak5

    yanlış anlamışsın ben evet algoritmasını sordum ama çözen programın değil oluşturmayı sordum

    çözmeyi yapabildin mi? çünkü bunda hata almıyorsan aynı şeyi tersten işleterek çözüm bulabilirsin.

    benim yazdığım kodda 3 ayrı çözüm metodu vardı. senin de kendine göre farklı çözüm metodun olabilir.

    -önce class içerisinde bir tane çözüm metodu yazmalısın. bunun adı da "cozum()" olsun.

    -sudoku içerisinde rastgele bir nokta seçilecek ve bu noktanın dolu veya boş olduğu kontrol edilecek.
    -eğer seçilen hücre boşsa 1'den 9'a kadar rastgele bir sayı üretilecek.
    -üretilen sayının sudoku kurallarına uygunluğu kontrol edilecek yani aynı kutu, satır veya sütunda bu sayıdan varsa yeni sayı üretilecek.
    -üretilen sayı seçilen hücreye atanacak.


    -her bir sayı atama işleminden sonra cozum() metodu çalıştırılarak sudokunun çözülebilirliği kontrol edilecek.
    -eğer çözülebiliyorsa artık yeni sayı üretilmeyecek ve sudoku son halini almış olacak.


    anladım eyvallah




  • son bir sorum olucak 3 boyutlu dizi de bir hücreye ait aynı satırdaki ve sütundaki değerleri nasıl kontrol ediyorsun?
  • quote:

    Orijinalden alıntı: nifak5

    son bir sorum olucak 3 boyutlu dizi de bir hücreye ait aynı satırdaki ve sütundaki değerleri nasıl kontrol ediyorsun?

    ilk mesajda yazdığım kodda nasıl seçtiğim görünüyor (kutu seç, satır seç, sütun seç şeklinde belirtilmiş) kod yazmaya başlamadan önce bunu bulmak için sayfalarca işlem yaptım.

    şu an işlemleri hatırlamıyorum, pc'ye geçince anlamaya çalışırım.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.