Algoritma Canavarları 7

+1 oy
9 Mayıs 2015 mstfergl Uzman Yardımcısı (4,710 puan)   sordu

Algoritma Canavarları yarışmamızın 7. sorusu ile karşınızdayız. Bu hafta farklı seviyede iki soru soracağız. Üyelerimiz istediği soruyu cevaplayabilir. Eğer isterlerse iki soruyu birden cevaplayabilir. 1. sorumuzun ödülü 10000 puan 2. sorumuzun ödülü 5000 puan. Yarışma hakkında detaylı bilgi için buraya tıklayınız. Yarışma süresi 48 saattir. Pazar günü 24.00'da yarışma sonlandırılacaktır.

Soru 1 

Standart bir satranç tahtası (8x8 boyutunda) üzerinde istediğiniz herhangi bir noktaya bir at yerleştiriyoruz. Bu at adım adım bütün karelere birer kez uğrayarak tüm kareleri dolaşmış olacak. İstediğiniz programlama dilinde yazabilirsiniz. İlk doğru cevabı kabul edeceğiz. Düzenleme zamanları dikkate alınacaktır.

Kural 1 : At L şeklinde hareket eder. 

Kural 2 : Çıktı olarak matris üzerinde atın gittiği kareler uğrama sırası ile belirtilecek. 

 

Soru 2

Bir top sahasında top atışları yapılmaktadır. 100 metre uzunluğundaki alanda 10'ar metre aralıklarla bloklar yerleştirilmiştir. 10 top atışı hakkımız var. Atılan top en fazla ne kadar uzaklıktaki bloğu devirebilir ? Bunu arıyoruz. Ancak bunu en az top atışı yaparak bulmamız gerekiyor. Kullanıcıdan başta bir uzaklık alıyoruz. Örneğin; 60 gibi. Buna göre 60 metrede ve daha daha yakın noktalardaki (50, 40, 20 gibi) bloklar devriliyormuş daha uzaktaki bloklar devrilmiyormuş. Kullanıcının girdiği bu değeri en az atışta tahmin etmek için gereken programın istediğiniz herhangi bir programlama dilinde kodunu yazınız. İlk doğru cevaba değil en etkili ve ilk doğru cevaba 5000 puan vereceğiz.

2 Cevap

+1 oy
9 Mayıs 2015 molcay Kıdemli Uzman (12,350 puan)   cevapladı
10 Mayıs 2015 Tahsin Dalman seçti
 
En İyi Cevap

Aşağıdaki adreste kodları bulabilirsiniz. Python 3 ile yazıldı

https://gist.github.com/molcay/e59d1d27d1f92b31e17e

Kodlar yazılırken şu sayfadaki yaklaşım(Warnsdorf's rule) kullanıldı.

+1 oy
10 Mayıs 2015 mehmetmerteren Uzman (5,640 puan)   cevapladı

2.soruyu anladığım kadarıyla şu şekilde yaptım.

Console.Write("Bloğun devrileceği en uzun mesafe : ");           int uzaklik = Convert.ToInt32(Console.ReadLine());                               bool [] uzaklik_devirme = new bool [10];
 int minumum_uzaklik = 10, maksimum_uzaklik = 100;
 for (int i = 0; i < 10; i++){
        if (i <= (uzaklik/10)) // Örneğin 60 değeri için 10, 20, ..., 50, 60 değerleri true olacak yani bu bloklar yıkılacak
        {
               uzaklik_devirme[i] = true;
        }
        else // Girilen değerden yüksek değerler kırılamayacağı için false olacak.
        {
                 uzaklik_devirme[i] = false;
        }
}
int sayac = 0;
while (minumum_uzaklik <= maksimum_uzaklik){
       int orta_nokta = Convert.ToInt32((maksimum_uzaklik + minumum_uzaklik) / 2);
       if (uzaklik_devirme[orta_nokta / 10])
       {
              sayac++;
              if ((orta_nokta + 10) <= 100 && uzaklik_devirme[(orta_nokta / 10)+1]){
                      sayac++;
                      minumum_uzaklik = orta_nokta + 10;
               }
              else{
                       sayac++;
                       break;
              }
     }else{
            sayac++;
            maksimum_uzaklik = orta_nokta;
     }
}
Console.WriteLine(sayac + " deneme sonucunda bulundu.");
Console.ReadLine();

...