Sağ Kalan En Son Kişi!

by Volkan Atasever 11. Kasım 2009 11:36

Bu yazımda N sayıda kişiden oluşan bir toplulukta her kişinin kendinden bir sonraki kişiyi ekarte sorunun orjinalinde geçen tanımlamasıyla öldürmesinden oluşmakta. Bizim bu problemde yapmamız istenen ise en son sağ kalan kişiyi bulmamız. Bu döngü bir kişi kalana kadar devam etmektedir. Aşağıdaki grafikte bu probleme yönelik bir grafiği görebilirsiniz. Bu mantıkta oluşan kişileri çember şeklinde düşünmemiz problemin çözümü açısından bize bir avantaj sağlamaktadır. C# ile bu işlemi çözerkende en basit ve yalın çözüm yolunu kullanmayı tercih ettim.


Aşağıda problemi çözerken kullandığım kullanıcı arayüzünü uygulayabilirsiniz. Konsoldan çalışmak bazen hız ve zaman açısından verimliliği tartışılamaz fakat problemlere daha modern bir arayüz katmak benim her zaman kullandığım bir yöntem.


N sayıda kişi arasından kaç kişinin çember içinde sağ kaldığını öğrenmemiz için giriş olarak sadece çemberde kaç kişi olduğunu yazmamız yeterli.

Butonumuza tıkladığımız zaman bu problemin çözümünü yazdığımız kod bloğu çalışacak ve bize sonucu bir message box aracılığıyla verecektir.

Kod bloğumuz;

     int kisisayi = Convert.ToInt32(textBox1.Text);

     bool ol = false;

     int sag=0;     int[] kisi = new int[kisisayi];

 

     int hepsi = kisisayi;

     for (int i = 0; i < kisisayi; ++i)

           kisi[i] = 9;//initial deger

     do

     {

           for (int i = 0; i < kisisayi; ++i)

           {

                if (kisi[i] == 9 || kisi[i] == 0)              

               if (ol == false)

               {

                        ol = true;

                        kisi[i] = 0;//yasiyor

               }

               else

              {

                       ol =
false;

                       sag = kisisayi;

                       kisi[i] = 1;//olu

                       hepsi--;

              }

        }

      }
while (hepsi != 1);

      string sags="";

     for (int i = 0; i < kisisayi; ++i)

     {

            if (kisi[i] == 0)

               sags = (i+1).ToString();

     }

     MessageBox.Show(sags);

İlk kısımda dinamik olarak oluşturduğumuz dizide kimsenin herhangi bir işleme maruz kalmadığını 9 rakamıyla gösterdik. Ölü olan kişiyi 1 ve yaşayan kişiyide 0 la işaretledir. Ardından tek kişi kalana kadar döngümüzü devam ettirdik böylece hiç işleme girmemiş ve yaşayan kişiler arasında öldürmeye devam ettik.

Tags: , ,

Algoritmalar

Yorumlar

14.11.2009 08:49:13 #

Caglar Cataloglu

eline saglik,

bir diger cozum yolu olarak da ArrayList mantigi dusunulebilir,

ArrayList a = new ArrayList();

            for (int i = 1; i <= adamSayisi; i++)
            {
                a.Add(i);


            }
            while (a.Count>1)
            {
                int sayi = Convert.ToInt32(a[0]);//ilk sayinin "degerini" tutuyoruz> sag kalacagi icin
                a.RemoveAt(0);//ilk sayiyi kaldiriyoruz, cunku sag kalcak ve adam oldurmeye devam edicek
                a.Add(sayi);// ilk sayi sag kaldigi icin listenin sonuna tekrar ekliyoruz, bi nevi cember yaratmak icin
                a.RemoveAt(0);//ilk sayi tarafindan oldurulen sayiyi da(2.ci sayi) oldugu icin kaldiriyoruz,
                              //boylece dongu tekrar dondugunde olen adamlar listenen temizlenmis olarak oyuna devam edilicek
                              //aksi halde listede olen adamlar birikeceginden sonsuz donguye giricek
              

            }
Console.Write(a[0]);//sag kalan kisimiz, her zaman dizinin ilk elemani oluyor
}

Caglar Cataloglu United States | Reply

14.11.2009 08:53:07 #

Caglar Cataloglu

Aciklamasiz kod:

static void Main(string[] args)
{
ArrayList a = new ArrayList();
for (int i = 1; i < 100; i++)//100 adam olsun
{
a.Add(i);
}
while (a.Count > 1)
{
int sayi = Convert.ToInt32(a[0]);
a.RemoveAt(0);
a.Add(sayi);
a.RemoveAt(0);
}
Console.Write(a[0]);
}

Caglar Cataloglu United States | Reply

Yorum ekle




  Country flag

biuquote
  • Yorum
  • Canlı önizleme
Loading



Son Yorumlar

Comment RSS

INETA User Group

Yazılım