Arama butonu
Bu konudaki kullanıcılar: 1 misafir
14
Cevap
10545
Tıklama
0
Öne Çıkarma
Sudoku çözen ve sudoku oluşturan uygulama yaptım :)
G
13 yıl
Yarbay
Konu Sahibi

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ç:
< Resime gitmek için tıklayın >


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 >

G
13 yıl
Yarbay
Konu Sahibi

açıklama:

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


< Resime gitmek için tıklayın >


Bu mesaja @Alexander Supertramp! cevap verdi.
A
13 yıl
Yüzbaşı

Ş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?

< Resime gitmek için tıklayın >



G
13 yıl
Yarbay
Konu Sahibi

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ı >
Bu mesaja @Alexander Supertramp! cevap verdi.
A
13 yıl
Yüzbaşı

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.


Bu mesaja 1 cevap geldi.
G
13 yıl
Yarbay
Konu Sahibi

bir kaç metot ekledim, artık daha zor seviyeli sudokuları çözebiliyor


Bu mesaja @Guest cevap verdi.
G
13 yıl
Yarbay
Konu Sahibi

en zor sudokuları çözebilecek bir metot ekledim.

hata olursa lütfen söyleyin.


Bu mesaja @Guest cevap verdi.
G
13 yıl
Yarbay
Konu Sahibi

ekteki dosyada sudoku oluşturma kodlarını verdim.



N
12 yıl
Er

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--;
}
}
}
}
}


Bu mesaja 1 cevap geldi.
G
12 yıl
Yarbay
Konu Sahibi

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:

< Resime gitmek için tıklayın >

-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 >
Bu mesaja @nifak5 cevap verdi.
N
12 yıl
Er

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:

< Resime gitmek için tıklayın >

-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


Bu mesaja 1 cevap geldi.
G
12 yıl
Yarbay
Konu Sahibi

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.


Bu mesaja @nifak5 cevap verdi.
N
12 yıl
Er

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



N
12 yıl
Er

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


Bu mesaja 1 cevap geldi.
G
12 yıl
Yarbay
Konu Sahibi

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ı >

DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.