Merhaba arkadaşlar bugün javada bir zeka sorusunu çözeceğiz..Sorumuz şöyle :
Soru : Bir hapishanede mahkum fazlalığı yüzünden bir kısım mahkumu öldürmek gerekmistir. Bu yüzden 1000 mahkum secilip bir cember şeklinde dizilirler.
1 den baslayarak sola doğru 1000 e kadar numara verilir. Ayrıca 1.mahkuma
bir kılıç verilir ve hemen solundaki mahkumu öldürmesi istenir ve öldürdükten sonra sıradaki mahkuma kılıcı verir, o da aynı seyi yapar.boyle boyle bir mahkum kalana kadar devam eder.
Sizce en şanslı mahkum kaç nolu mahkumdur ?
Bu soruyu 10 kişi için kağıda döküp çözebilirsiniz ama yüksek sayılar için biraz daha zor olur..Aslında kendiniz çözseniz arasındaki ilişkiyi bulunca çok zor değil ama buna çok girmeyeceğiz ,biz şimdilik bilgisayara çözdürmeye çalışalım..
Soruyu çözerken şu yolu izledim;Önce bir liste(ArrayList) tanımlayıp 1 den,1000 e kadar mahkumları diziye ekledim.Sonra bir while döngüsü kurdum,ve kalan mahkumların sayısı 1 den fazla olduğu sürece çalış dedim.Bu döngü içinde de kılıclı mahkumun hemen yanındaki kisiye ölüm indexi verip öldürdüm(diziden çıkardım).
Burda püf nokta şu;çember şeklinde olduğu için dizinin son elemanı öldüyse,kılıç baştaki elemana geri verilecek ve aynı işlemler tekrar edilecek,o yüzden eğer öldürülen eleman sondaki elemansa ölüm indexini 1 yaptık(Yani en baştaki elemanın yanındaki ölecek..Indexlerin 0 dan başladığını unutmayın..)Ama dizinin sondan bir önceki mahkumu öldüyse, artık kılıç sondaki mahkuma verilecek ve bu mahkumda hemen yanındaki mahkumu;yani en baştaki mahkumu öldürecek(Çember şeklinde olduğu için)..O yüzden bu durumda da ölüm indexini 0 yaptık..
Kodlarımız da şöyle,anlamadığınız yer olursa sorabilirsiniz,kolay gelsin şimdilik..
[java] import java.util.ArrayList; public class KilicZekaSorusu { public static void main(String[] args) { ArrayList<Integer> arrMahkumlar = new ArrayList<>(); int mahkumSayisi = 1_000; for (int i = 1; i <= mahkumSayisi; i++) { arrMahkumlar.add(i); } int kilicliMahkum = 0; while (arrMahkumlar.size() > 1) { int olumIndex = kilicliMahkum + 1; if (olumIndex == arrMahkumlar.size()) { olumIndex = 0; kilicliMahkum = -1; } else if (olumIndex > arrMahkumlar.size()) { olumIndex = 1; kilicliMahkum = 0; } arrMahkumlar.remove(olumIndex); kilicliMahkum++; } System.out.println("Hayatta Kalan Mahkum : " + arrMahkumlar.get(0)); } } [/java]
Çıktı:
run:
Hayatta Kalan Mahkum : 977
BUILD SUCCESSFUL (total time: 0 seconds)