Sudoku bulmacalarını nasıl oluşturabilirim?


17

Bir Sudoku bulmaca üreticisi yapmaya çalışıyorum. Beklediğimden çok daha zor ve ne kadar çok girersem o kadar zorlaşıyor!

Mevcut yaklaşımım, sorunu 2 adıma bölmektir:

  1. Tam (çözülmüş) Sudoku bulmacası oluşturun.
  2. Çözülebilir ve sadece 1 çözümü olana kadar sayıları kaldırın.

1. adımda, kaba kuvvet yöntemleri kullandığım için, bazı çalışma süresi sorunları ile karşılaşıyorum. Tam bir Sudoku bulmacasını doldurmanın en iyi yolu var mı?

2. adımda, çözülmüş bir sudoku'yu "şaşırtmak" için ne tür bir algoritma kullanmalıyım?


Bu soruda nasıl bulmaca üreteceğinizi çıkarabileceğiniz bazı bilgiler var
cırcır ucube

3
: Bu soru da Gables üzerinde sorular (ve orada daha iyi cevap vermektedir) olmuştur puzzling.stackexchange.com/questions/142/...
congusbongus

Yanıtlar:


30

İOS uygulama mağazasında en çok satan Sudoku oyunum var. Bulmacaları nasıl ürettiğim aşağıda açıklanmıştır.

Öncelikle bir bulmaca üreticisi uygulamam var. Ama oyunun kodunun bir parçası değil. Bu bulmaca yapmak için kullandığım tek başına bir uygulama. Farklı desen türleri, zorluk dereceleri, hediye sayısı, vb. Oluşturmak için ayarlayabiliyorum. Bu yüzden, "tohum bulmacaları" dediğim şeyi üretiyorum ve oyunun kodu tarafından insanların oynadığı bulmacaları oluşturmak için kullanılan şey bu.

Burada bir jeneratörü nasıl kodlayacağımı cevaplamıyorum. Google'a çevrimiçi olarak tonlarca bulmaca üreteci kodu bulabilirsiniz. Oradan başlayın. Ama iyi bir oyun yapmak için iyi bir oyun yapmanız gerekiyor. Oyunum anında bulmaca oluşturmuyor.

Bulmaca üreteci uygulamamın çalışma şekli, dakikada binlerce bulmaca üretmesidir, ancak hepsi iyi değildir ve hepsi belirli bir zorluk derecesine uymaz. Jeneratör bir bulmaca yaratır, sonra çözer ve bir zorluk derecesi bulur ve bulmacayı çözmek için gerekli tekniklere dayanarak bulmacayı puanlar ve onu çözmek için tahmin gerekip gerekmediğini belirler (genellikle kötüdür). Bir kriterle uyuşmayan bulmacaları fırlatır. Zor ama imkansız olmayan bulmacalar için, hızlı bir makinede, tam özelliklerimle eşleşen 100 bulmaca üretmek bir saat sürebilir. Bu yüzden bunu uygulamada yapmıyorum. Bu zorlu özelliklerle anında bulmacalar oluşturmak, uygulamamdaki bulmacaların kalitesi için işe yaramaz.

Bulmacalar dizeler, 162 karakter uzunluğunda, 81 karakter sayı ve tire veya boşluk olacak nokta, daha sonra 81 çözüm ile. Daha sonra, kaç single, double, vs. gibi istatistiklerin her biri için sütunlar.

Tüm nesil oturumlardan çıktılarım, sütun olarak istatistiklerle virgülle ayrılmış satırlardır. Belki 10.000 bulmacayı alıp onları mükemmel hale getireceğim ve zorluk derecesine göre sıralayacağım. Sonra onları oyun tahtasında görmek için bir uygulamaya getirin. Ayrıca görsel çekicilik ve bulmacanın görünür desenleri için onlara bakıyorum. Sonra onlardan elimi seçiyorum.

Onlara tohum bulmacaları diyorum ve işte bunu kastediyorum. Sudoku oyunundaki sayılar gerçekten sadece jetonlardır. 1-9 arasındaki sayılar yerine renkler, semboller veya harfler olabilirler. Bu yüzden benim tohum bulmacaları sayı değil ai harfleri. Her tohum bulmacası oynanabilir bir bulmaca yapmak için anında değiştirilir:

  1. Sayıları / simgeleri rastgele. Ai harflerini 1-9 arasındaki sayılara çevirdiğimde, arama tablosu rasgele dağıtılır. Yani a her zaman 1 değildir. Tek başına her bulmacada yaklaşık 300.000 varyasyon oluşturur.
  2. Bulmacayı 90, 180 veya 270 derece döndürün. Bu, 4 varyasyon daha ekler.
  3. Yapboz yatay, dikey veya her ikisi de flop. Bu, 4 varyasyon daha ekler.

Her tohum bulmacası 5.806.080 varyasyon oluşturabilir. Bunu gerçek oyuncularla sahada test ettim. İnsanlar aslında aynı bulmacayı oynadıklarını bilmiyorlar. Aslında imkansız. Sadece verilen desenlerin her seferinde aynı olduğunu fark etselerdi. Ancak 100 farklı tohumla bile kimse fark etmeyecek. Oyunumun bir milyon kullanıcısı var. Çözücü uygulamalarla da test ettim. Bir çözücü uygulaması, bir bulmacayı döndürüldüğünde veya yırtıldığında aynı şekilde çözmez. Teknik olarak aynı bulmacayı olsa bile bazen farklı bir zorluk derecesi olarak analiz edecektir.

Bununla birlikte, Big Bad Sudoku Book, 5 zorluk seviyesinde 1000'in 10'unda tohum bulmacasına ve çoklu bulmaca desenlerine sahiptir. Bu, oyunumda milyarlarca bulmaca olduğu anlamına geliyor. Her 10.000 tohum bulmacasında 58.060.800.000 farklı bulmaca var.

Sudoku Book sürüm 4'te (2016'da çıkacak), 58 milyardan tam bir bulmaca belirleyip her oyuncunun cihazında aynı bulmacayı alabilmenin bir yolunu buldum.


Çok yararlı bir yazı. Ürettiğiniz tohumların diğer tohumlardan oluşturulabileceğini, yani aynı tohumlarınız olduğunu kontrol ediyor musunuz?
VLAS

Evet. Hepsini metin arkadaşına bırakıyorum ve bir çeşit yapıyorum. Ardından kopyaları kaldırın. Hiç kaldırılmadığını sanmıyorum. Tohumlar kesinlikle eşsizdir. Aynı bulmacayı iki farklı tohumdan yapmak imkansız. Bir gün tam süreci göstereceğim, ama şimdi hala yöntemlerimden yararlandığımda değil. :)
badweasel

Aslında bütün sürecim hemen hemen burada.
badweasel

2
Sayıların sadece jeton olduğu ve varyasyon yapabilmenizin yolu yalnızca harflere atanan sayıları değiştirmektir.
S. Mitchell

Gerçekten faydalı bir cevap! 3 sütun ve 3 satırınız olduğundan, 4 farklı varyant oluşturmak için orta sütunu sola veya sağa, orta satırı yukarı veya aşağı taşıyabilmeniz gerekir. Ve bulmacayı dikey olarak döndürmek veya yatay olarak atlamak yerine, 4 farklı varyant için sol ve sağ sütunları (ve üst ve alt satırları) takas edebilirsiniz. Bu yüzden bir tohumdan 43 milyon varyasyon almanız gerektiğini düşünüyorum.
Roger_S

4

Adım (1) Tam (çözülmüş) Sudoku bulmacası oluşturun, kaba kuvvet yöntemi kullandığım için, bazı çalışma süresi sorunları ile karşılaşıyorum. Tam bir Sudoku bulmacasını doldurmanın en iyi yolu var mı?

Tam bir Sudoku bulmacasını doldurmanın kolay bir yolu var - grup doldurma ve dairesel kaydırma.

  1. İlk satırı dokuz farklı sayı ile doldurun.
  2. İlk satırın kayması olan ikinci satırı üç yuva ile doldurun.
  3. İkinci satırın kayması olan üçüncü satırı üç yuva ile doldurun.
  4. Üçüncü bir kaydırma olan dördüncü satırı bir yuva ile doldurun.


line 1: 8 9 3  2 7 6  4 5 1
line 2: 2 7 6  4 5 1  8 9 3 (shift 3)
line 3: 4 5 1  8 9 3  2 7 6 (shift 3)

line 4: 5 1 8  9 3 2  7 6 4 (shift 1)
line 5: 9 3 2  7 6 4  5 1 8 (shift 3)
line 6: 7 6 4  5 1 8  9 3 2 (shift 3)

line 7: 6 4 5  1 8 9  3 2 7 (shift 1)
line 8: 1 8 9  3 2 7  6 4 5 (shift 3)
line 9: 3 2 7  6 4 5  1 8 9 (shift 3)

Kullanıcının belirgin deseni fark etmesini önlemek için, artık herhangi bir desen kalmaması için satırların ve sütunların sırasını rastgele ayarlamak iyi bir fikir olabilir. Her satır / sütundaki 9 sayının hepsi bir atom birimi olarak birlikte hareket ettiği sürece, Sudoku kartı her zaman geçerli kalacaktır.

Tam bir Sudoku bulmacası alırsınız. Daha fazla bilgi için "Sudoku yap" ifadesini arayabilirsiniz.


3

Sudoku çözücünüz olması şartıyla çok zor değil.

Sudoku çözücü yapmak zor / ilginç bir sorundur, bu yüzden farklı bir soru için kaydetmek en iyisidir. Ya da sadece okuyabilir bu ve gitmek nasıl.

  1. Çözülmüş bir bulmaca oluşturmak için, çözücüyü boş bir tahtada çalıştırın. Tek uyarı çözücünün kullandığı "tahminleri" rastgele seçmelisiniz, aksi takdirde her seferinde aynı bulmacayla karşılaşabilirsiniz. Yani, bir noktada çözücü bir hücre için bir sayı deneyecek; bu sırayla deneyebilir:1, 2, 3, 4, ... ve çalışan ilkini seçin. Diyelim ki, bu sırayı karıştırmanız gerekir, diyelim ki 4, 7, 2, 9, .... Bu işlem çözücünüz kadar hızlı olmalıdır.
  2. Sayıları kaldırmak için şu algoritmayı kullanın:
    • Daha önce kaldırmayı denemediğiniz rastgele bir sayı seçin
    • Numarayı kaldırın, çözücünüzü kaldırılan numarayı burada kullanamaması koşuluyla çalıştırın
    • Çözücü bir çözüm bulursa, numarayı kaldıramazsınız
    • Yeterli sayıları kaldırana kadar tekrarlayın (veya daha fazla kaldıramazsanız)

Bu çok basit (ve naif) bir yöntemdir, bu yüzden eksik sayıların sayısının yanı sıra belirli bir zorluktaki bulmacaları alacağınızın veya istediğiniz sayıların miktarını kaldırabileceğinizin garantisi yoktur. Umarım bu yine de yardımcı olur.


Çözücünün aynı durumdan birden fazla çözüm bulamadığından emin olun. Normalde sadece bir çözüm olmalıdır. Ayrıca, çözücünün zorluğu belirlemek için çözümü bulmak için atması gereken mantıksal adımları kontrol edebilirsiniz, örneğin x-kanat stratejisini mi kullanması gerekiyordu ...?
OriginalDaemon

1
@OriginalDaemon, ilk noktanızla ilgili olarak, üçüncü nokta noktasında ele alınır: bu sayıyı kaldırmak ikinci bir çözümle sonuçlanırsa, geri dönün.
congusbongus

0

Ben sadece bu web sayfasına dikkat çekmek ilginç olduğunu düşünüyorum , çünkü proyect geliştirme için bana çok yardımcı oldu. Benzersiz bir çözümle sudoku yapmak basit bir işten çok uzaktır. Bağlantıda, yazarın (gerçekten iyi bir iş çıkardı, onun benim değil!) Birkaç farklı strateji bulduğunu bulabilirsiniz. Kendi Sudoku çözücünüzü oluşturmak için bir fikriniz olabilir.

Şimdi, konuyla devam ederken, benzer sudokus üretmenin bir yolu da var, sadece

  1. Satırların permütasyonu.
  2. Diğer basit çözüm, minimun 17 basamaklı bir sudoku doldurmakla başlamaktır (benzersiz bir çözüm bulmak için kanıtlanmış minimun) ve aşağıdaki farklı stratejileri doldurmaktır (örneğin, önceki bağlantıda stratejiler zorluklara bölünür, benzer bir şey yapabilirsiniz), benzersiz çözüm ulaşana kadar.
  3. 16 basamaklı benzersiz bir çözüm sudoku bulmaya çalışan bir matematikçinin bir listesi vardı ve 17 basamaklı sudokus HUGEEEEEE listesi vardı. Herhangi bir kopya yazma olup olmadığını hatırlayamıyorum, ama eminim, eğer ona başka 17 benzersiz çözüm sunabilirseniz sudoku verilerini kullanmanıza izin vermekten mutluluk duyacaktır.

Şerefe ve algoritma ile iyi şanslar: D


Hmm, bağlantı jeneratör değil sudoku çözücü içindir.
greenoldman

@greenoldman EVET, ÇÖZÜCÜSÜ. Kullanıcı için ilginç olduğunu düşünüyorum çünkü o mevcut yöntemi bir sayı kaldırmak ve çözmek. Bağlantı, kısmi sudoku'nun daha hızlı çözülmesi için stratejiler veriyor
David Sánchez

0

Çözücüm kaba kuvvet kullanıyor ve 20 milisaniye içinde çözüm bulabiliyor. Yukarıda açıklanan silme yöntemini kullanarak, jeneratörüm 200 milisaniye içinde bir bulmaca üretir.

Genellikle yaklaşık 24-34 basamaklı bir bulmaca oluşturur ve hala dünyada 17 basamaklı bir bulmaca üretmeyi nasıl başardıklarını bilmiyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.