folder Tahribat.com Forumları
linefolder C - C++
linefolder Oyalanacak İş Arayanlara - Algoritma Sorusu



Oyalanacak İş Arayanlara - Algoritma Sorusu

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    JPriest
    JPriest's avatar
    Kayıt Tarihi: 09/Mart/2007
    Erkek

    Şu aşağıdaki iki örnek gibi, herhangi bi şekilde başlangıç konumu verilen tabloyu

    8 7  
    1 3 4
    6 5 2

     

    8 2 6
      3 4
    7 5 1

    şu hale getirebilecek algoritma, C, C++, C#, Java, Php, Pascal, Python  vs herhangi bir dildeki kodu ya da çözüm üretecek herhangi bir şeyler.

    1 2 3
    8   4
    7 6 5

    Ben biraz uğraştım yemedi, belki ilginizi çeker. Amaç soru sormak falan da  değil, öyle esti paylaşayım dedim. İlgilenip çözen olursa biz de birkaç şey öğrenmiş oluruz belki.

    Buna benzer oyunları görmüşsünüzdür zaten. Kurallar basit, bi tane boşluk var, rakamlar sağa, sola, yukarı ya da aşağı kayarak son hale dönüşmek isteyecekler. Ya da herkes istediği şartları yazsın, kendi kuralını oluştursun. 


    Sen hiç kaval çaldın mı?
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    celoron
    celoron's avatar
    Kayıt Tarihi: 13/Ekim/2008
    Erkek
    yeni halinin tek özelliği sarmal olarak 1den 8e gitmesimi?

    Microsoft isn't evil, they just make really crappy operating systems. Linus Torvalds
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    JPriest
    JPriest's avatar
    Kayıt Tarihi: 09/Mart/2007
    Erkek
    Bu örnek için öyle, ama sen istediğin başka türlü şartlar da ekleyebilirsin.

    Sen hiç kaval çaldın mı?
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ltcelik
    ltcelik's avatar
    Kayıt Tarihi: 11/Mayıs/2007
    Erkek

    başla

    matrisin boyutunu oku (M (X , Y) )

    matris kümesini oku 

    matris kümesini büyükten küçüğe sırala A s dizisine yükle 

    S=1

    U=1 V=1

     

    10 i=1 j=1

    15 S x*y den büyük mü E -> "matris tamam" bitir

    20 M(ij) ye As yi ata

     

    40 i+1 X den büyük mü

     

         H-> j= j+v  ( yan sütuma geç ) 15e git

          E -> i=i+u ( alt satıra geç) j=Y s= s+1 15e git 

     ( mesai ibitti evde devam ederim )

     

     


    Din Kitaplarını Okuyup Anlayana Ateist, Okuyup Anlamayanlara "dindar" denir... Nikola TESLA.. ben mi? Ne okurum ne anlarım... Kendi kendime de uyuz oluyorum ama olamıyorum.. "Ama efsaneyi çıkarıp atarsan ve yaptıkları eylemlere bakarsan... ..Jedi'ların mirası başarısızlıktır. İkiyüzlülüktür, kibirdir."
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Destroyer
    Destroyer's avatar
    Kayıt Tarihi: 27/Eylül/2003
    Erkek

    Bu konuda http://www.tahribat.com/forumdisplayfolder.asp?folderid=80854 yazmış olduğum cevap.

    Tek fark manhattan mesafe'lerin farklı şekilde hesaplanması.


    -------------

    Selam,

    Bu puzzle'ın optimal çözümüne o kadar da ağır olmayan bir heuristic ile ulaşılabilir. A* (astar) search algoritmasını (http://www.autonlab.org/tutorials/astar08.pdf) duymuşsunuzdur.Çözümümüzde tam anlamıyla bu search algoritmasını kullanacağız.

    Bu algoritmayı kullanlanırken h değerini (yani puzzle'ın bir pozisyondaki önem değerini), her tuşun bu pozisyondaki yeri ile olması gereken yerinin arasındaki Manhattan mesafesinin (http://www.improvedoutcomes.com/docs/WebSiteDocs/Clustering/Clustering_Parameters/Manhattan_Distance_Metric.htm) mutlak degerlerinin toplayarak bulacağız.

    Verilen bir puzzle'da öncelikle ilk pozisyon için h değerini buluyoruz ve priority queue denilen yapıya bu pozisyonu değeriyle beraber koyuyoruz. Sonra bu pozisyondan üretilebilecek pozisyonlar için aynı şekilde h hesaplamalarını yapıyoruz ve priority queue'ya koyuyoruz. Bundan sonraki adımlar bir loop'un içinde geçecek, puzzle'ın olması gerektiği pozisyona ulaşınca bu loop'tan çıkacağız.

    Loop'umuz başladı.

    Priority queue'dan en küçük h değerli pozisyonu çekiyoruz.

    Eğer pozisyon orjinal puzzle posizyonuysa tamamdır sonuca ulaştık.

    Değilse, pozisyondan üretilebilecek pozisyonları buluyoruz, h hesaplamalarını yapıyoruz ve priority queue'ya koyuyoruz.

    Loop'un başına dönüyoruz.

    NOT: Priority queue'ya koyarken aynı pozisyonları koymamaya dikkat edilmeli. Üsünde geçilmiş pozisyonların bir listesini array yapısında tutabilirsiniz.

    NOT: Pozisyonları oluştururken, parent pozisyonlarını unutmamak gerekiyor. Bunu da bir pointerla halledebilirsiniz.

    Bu greedy heuristic olup da optimal sonuca götüren bir çözümdür.

    -------------

     


    d.d.
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ltcelik
    ltcelik's avatar
    Kayıt Tarihi: 11/Mayıs/2007
    Erkek

     

    Algoritmanın  püf noktası  başlangıç adresinden sonra başlngıc yönünde bir sonraki hücreye eleman yerleştirilip yerleştirilemeyeceği (matris sınırları aşılıyor mu yoksa yan hücreye daha örce veri ğirilmiş mi?) ve buna bağlı yön değişim kararı prosedürü. ve yerleştirecek eleman kalıp kalmadığı

     

    Öncelikle matrise yerleştirilecek dizi küçükten büyüğe sıralanır, boş hücreler için 0 lar dizi sonuna atılır. 

    ilk olarak elemanı yerleştirdikten sonra, dizide eleman kaldığı sorgulunır 

    Diğer bir husus da yazmaçın yatay ve düşey doğrultuda yön vektörlerinin tesbiti 

     yatay hareket vektörü U düşey hreket vekkörü V +/-1 değerlidir ki yazmaça hreket vektörü doğrultusunda bir birim ilerle dediğimizde  indisler üzerinde ileri geri  aşağı yukarı  hareket edebilelim.( her kdoğrultu değiştiğinde mevcut doğrultuda hareket yönü terslenir yatayda sağa gderken köşe dönünce ikinci köşede sola gitmek zorunda)

     

    aşağıdaki program  önerisinde başlangıç nokası 1,1  pozitif hareket yönler sağ ve aşağı olarak var sayılmaka birlikte dış girdi olarak da  alınabilir sistemi değiştirmez 450-470

     

    Hücrelelere daha önce elelman atamasının kontrolü için D(,) gölge/duvar mattrisi oluşturdum eleman yerleşen hücreye 1 atadım ki kaynak dizinin sıfırları kafa karıştırmasın

    temelde BASIC olmasına rağmen hemen her dilde olan basit komutlardır

     

    50 input "matris sat˝r X " ; x

    60 input " matris s¸tun say˝s˝ Y ": y

    70 "eleman say˝s˝" ES=x*y



    100 for b=1 to ES

    200 input " matris elemanlar˝n˝ giriniz" e(b)

    210 next



    220 gosub ELEMAN SIRALA



    230 "elemanlar başarıyla ˝ EL(en) dizisine atandı "



    235 " duvar matris matris sıfırlanıyor

    240 for i=1 to x

    245 for j=1 to y

    250 D(i,j)=0

    255 next j

    256 next j







    450 u=1, v=1 ,i=1,j=1,**en=1 // s=1



    ilk ELEMAN YERLEşTir

     460 T(1,1)=EL(1) D(1,1)=1

     470 en=en+1

     480 if en > ES then 899 



    490 yatay hareket deerlendirmesi

     500 yhd = j+u*1>x or j+u*1<1 or D(i,j+u*1)

     510 if yhd=1 u=-1*u : goto 650 (DHD )

     520 j=j+u*1

    530**   T(i,j)=EL(en): en=en+1   // 530 T(i,j)=EL(en)

    540** if en > ES then 899     //if en+1 > ES then 899

     550 goto 490



    650 Dikey hareket deerlendirmesi

     660 dhd= i+v*1>y or i+v*1<1 or D(1+v*1,j)=1

     670 if dhd=1 v=-1*v : goto 490 (YHD )

     680 i=i+v*1

     690**  T(i,j)=EL(en) :en=en+1   //T(i,j)=EL(en)
     695**if en > ES then 899   //


     700 goto 650

    899** matris yerleşti

    900 end


    düzeltme ve özür: mürit kardeşlerim kusurua bakmayın 15 yıldır ne algoritma ne program yazdım  ** lı düzeltmeler yapılmalı ki sıradaki elemanın indisiyle çağrılabilsin // eski yanlış koddur 

     

     

     

     


    Din Kitaplarını Okuyup Anlayana Ateist, Okuyup Anlamayanlara "dindar" denir... Nikola TESLA.. ben mi? Ne okurum ne anlarım... Kendi kendime de uyuz oluyorum ama olamıyorum.. "Ama efsaneyi çıkarıp atarsan ve yaptıkları eylemlere bakarsan... ..Jedi'ların mirası başarısızlıktır. İkiyüzlülüktür, kibirdir."
Toplam Hit: 2473 Toplam Mesaj: 6