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.