Dört küp problemi içeriğinde elimizde bulunan dört adet küpün her yüzeyini elimizde bulunan dört renk ile boyamamız istenmektedir. Dört rengin tamamı kullanılmalı ve geriye kalan iki yüzey de bu renklerden birisi ile ya da bu dört renkten farklı iki tanesi ile boyanabilir. Renklendirme işleminden sonra ise bu dört küp üst üste yerleştirilmektedir. Elde edilen dikdörtgen prizmanın dört yüzeyinde de dört rengin her birinin olması istenmektedir, yani hiçbir renk tekrar etmemelidir.
Problemin çözümüne ilişkin verilen algoritmada öncelikle dört küpün karşılıklı yüzeylerine gelen renkleri gösteren bir graf çizilir. İkinci aşamada ise çizilen bu graftan tüm renkleri içinde bulundurma koşulunu sağlayan iki döngü seçilir. Seçilen bu döngüler dört küpün her birinden de çekilmiş olan bir kenar içermelidir. İlk döngü için seçilen kenarlar ikinci döngü için seçilemez. Son olarak seçilen bu iki döngüden küplerin dört yüzeyine renkler yerleştirilir. Döngülerdeki birinci küpten çekilmiş olan kenar birinci küpün yüzeylerine karşılıklı olarak yerleştirilecek renkleri vermektedir. Aynı şekilde ikinci, üçüncü ve dördüncü küplerden çekilen kenarlar bu küplere karşılıklı olarak yerleştirilecek renkleri verir. Renkler yüzeylere yerleştirilirken diğer küplerde aynı tarafta bulunan yüzeylerde aynı rengin olmamasına dikkat edilmelidir.
Probleme ilişkin örnek aşağıdaki gibidir;
- AŞAMA: Yüzeylerin Renklendirilmesi
2. AŞAMA: Ana Grafın Çizilmesi
3. AŞAMA: Döngülerin Belirlenmesi
4. AŞAMA: Dört Küpün Üst Üste Yerleştirilmesi
Programın İşleyişi:
Programın kod kısmında matematiksel olarak işlemlerin kolaylaşması için renklere sayısal değerler atandı ve veriler kullanımına uygun olarak liste ve diziler içerisinde tutuldu.
Tasarımın tamamı görseldeki gibi basit oluşturuldu. En üstte bulunan kısım dört küpün açılmış halidir yani altı yüzeyin tamamı görülmektedir. İlk buton olan “Rastgele Renk Ata” butonu tıklandığında program küplerin tüm yüzeylerine her renkten bulunma koşuluna uygun olarak rastgele renk atamaktadır.
Program bu işlemi dört küpü temsil eden diziler içerisine 0 (mavi) 1 (yeşil) 2 (sarı) 3 (kırmızı) sayılarından rastgele bir tanesini atayarak gerçekleştirir. Dizilerin bu sayıların hepsini içermesi durumu kontrol edilerek eğer tüm küplerde bu dört sayı da bulunuyor ise form ekranındaki yüzeylerin boyanması (karelerin çizimi için buton kullanıldı ve renk değişimi butonun backcolor unun değişimi ile sağlandı.) işlemi gerçekleştirilir.
İkinci buton olan “Yüzeyleri Temizle” butonuna tıklandığında ise tüm yüzeyler açılış ekranındaki gibi beyaza boyanır.
“Manuel Renk Atama” seçeneği kullanılacak ise combobox içerisinden bir renk seçilip istenilen yüzeye tıklanarak boyama işlemi yapılabilir. Bu işlem yapılırken de kullanıcının küplerin tamamında dört rengi de kullanması gerekir.
Seçilen renge verilen sayısal değere göre program dizilere verilerin atamasını yapmaktadır.
Manuel renk atama işlemi tamamlandıktan sonra “Devam” butonuna basılmalıdır. Eğer Kullanıcı renk atama işlemini yaparken tüm küplerde dört rengi kullanmadı ise program uyarı vermektedir.
Bu işlemde rastgele renk atamada olduğu gibi dizilerin sayısal içeriği kontrol edilerek gerçekleştirilir. Ve hangi dizide renkler için atanan tüm sayılar (0,1,2,3) kullanılmadı ise bu dizi hangi küpü temsil ediyorsa, küpü de belirten bir uyarı penceresi açılmaktadır.
Küplerin tüm yüzeyleri probleme uygun olarak tamamlandıktan sonra “Devam” butonuna tıklandığında öncelikle görselde devam butonunun sağ tarafında bulunan dört renk üzerinde verilen dört küpün karşılıklı yüzeylerinden çekilen kenarlar ile graf yapısı oluşturulur.
Bu işlem karşılıklı renkler (sayısal değerleri) koşul olarak alınarak verilen sabit dört rengin koordinatları arasında çizgiler çekilerek gerçekleştirilir (Drawing kütüphanesi kullanıldı.). Öncelikle bu karşılıklar (karşılıklı renkler) küpleri temsil eden dizilerden her küp için oluşturulan üç elemanlı dizilere çekilir ve buradan graf çizilirken kullanılır.
İkinci aşama olarak çizilen graf içerisinden çekilebilecek tüm döngüler bulunur ver devam butonu altındaki textbox içerisinden sayısal olarak verilir. Verilen sayı 8 hanelidir ve ikili olarak ayrıldığında ilk iki eleman ilk döngüden çekilen kenarı, ikinci ikili sayı ikinci küpten çekilen kenarı ve sonraki ikililerde üçüncü ve dördüncü küplerden çekilen kenarları temsil etmektedir.
Program içerisinde bu işlem oluşturulan üç elemanlı dört diziden birer eleman çekilerek sağlanır ve bu 8 haneli döngüler string türünde bir liste içerisine atanır. Atamadan sonra ise tüm renklerin (renkler için atanan sayıların) bulunup bulunmadığı kontrol edilir. Bu işlem n=3 olan dört adet for ‘un iç içe çalışması ile sağlanır ( O = ). 8 hane içerisinde tüm renklerin olması koşulu ile döngü olması koşulu aynı fonksiyon içinde kontrol edilmiştir. Döngü olması koşulunu sağlaması için tüm renklerden iki tane bulundurmak zorundadır. (Bu işlem için foreach fonksiyonu kullanıldı.)
Üçüncü aşamada ise döngülerin aynı kenarları kullanmamış olması koşulu kontrol edilir.
Bu yapılırken döngüleri temsil eden 8 haneden sıralı ikililer alınarak karşılaştırılır. Yani İlk döngünün ilk iki elemanı ile ikinci döngünün ilk iki elamanı karşılaştırılır. Eğer bu elmanlar aynı ise iki döngü de birinci küpten gelen bir kenarı kullanmış demektir küplerin üst üste dizilmesi için bu iki döngü birlikte kullanılamaz. Tüm döngülerin birbirine denk gelen tüm ikilileri karşılaştırıldıktan sonra eğer uygun bir döngü ikilisi bulunamadıysa “2’den az sayıda döngü olduğu için istenilen sonuç elde edilemez!” uyarısı verilir. Bulunan kullanılabilir döngüler sayısal olarak ikinci textbox içerisinde verilmektedir.
Tüm koşulları sağlayan bir döngü ikilisi bulunduktan sonra bu döngüleri gösteren iki graf çizilir, form ekranında “Küpler çizilebilir.” metni gösterilir ve form ekranının alt kısmına dört küpün üst üste yerleşimini gösteren küplerin dört yüzeyi çizilir. Belirlenen iki grafa göre bu yüzeylere renk atamaları yapılır. Bu yapılırken küplerin aynı tarafta bulunan yüzeylerine aynı rengin gelmemesi kontrol edilir.
Program dört yüzeye renklerin yerleşimi yaparken öncelikle döngülerden ikilileri çeker örneğin ilk iki eleman ilk küp için karşılıklı iki yüzeyi temsil eder. İki küpten de çektiği bu ikili elemanların yüzeylere yerleşimi yerlerinin rastgele belirlenmesi ile sağlanır. Rastgele alınan 0 veya 1 değerine göre renkler yüzeylere yerleştirilir (renklerin sayısal değerleri dört haneli dizilerde tutulur). Dört küpün de tüm yüzeylerine renkler rastgele yerleştirildikten sonra aynı tarafta bulunan yüzeylere aynı rengin gelmemesi koşulu kontrol edilir. Bunun için n=4 olan bir for döngüsü kullanılır. Eğer bu koşulu sağlamıyorsa fonksiyon kendisini tekrar çağırmaktadır. (Rekürsif fonksiyon yapısı.) Koşul sağlandığında oluşturulan dört haneli dört dizi sol altta bulunan textbox içerisine yazılır, ilk iki değer karşılıklı iki yüzey için renkleri son iki değer de geriye kalan karşılıklı iki yüzey için renkleri vermektedir. Bu dizilerden alınan sayısal verilere göre yüzeyler sayıların temsil ettiği renklere boyanır.
Uygulamayı indirmek için -> tıklayınız.
Bir yanıt yazın