1. sayfa
açıklama: dizi[9][3][3] biraz karışık olabilir resimle göstereyim: < Resime gitmek için tıklayın > |
Ş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 > |
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. |
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. ![]() |
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--; } } } } } |
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 |
çö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? |
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. |
1. sayfa
İ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:
Benim için asıl zor olan bu kodun neyi çözeceği oldu
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
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 >