# ╔═══════════════════════════════════════════════════════════════════╗ # ║ YOL BULMA — Genişlik Öncelikli Arama (BFS) ║ # ║ Dalga başlangıçtan yayılır, hedefe varınca yol geri izlenir. ║ # ║ Dalga mavi, bulunan yol sarı, duvarlar koyu. ║ # ╚═══════════════════════════════════════════════════════════════════╝ kullan kaba.sistem EN = 21 BOY = 11 fonksiyon renkli(yazi: metin, renk: sayi): don "\033[38;5;" + metin(renk) + "m" + yazi + "\033[0m" fonksiyon ekrani_temizle(): yazdir("\033[H\033[2J") # Izgara tek boyutlu listede tutulur: (satir * EN + sutun) fonksiyon haritayi_ciz(duvar, uzaklik, yol, baslik_yazi: metin, ziyaret: sayi): ekrani_temizle() yazdir("") yazdir(renkli(" " + baslik_yazi, 81)) yazdir(renkli(" " + "─".tekrarla(EN * 2 + 2), 238)) y = 0 iken y < BOY: satir = " " x = 0 iken x < EN: k = y * EN + x eger duvar[k] == 1: satir = satir + renkli("██", 236) degilse: eger yol[k] == 1: satir = satir + renkli("▓▓", 220) degilse: eger uzaklik[k] >= 0: satir = satir + renkli("░░", 74) degilse: satir = satir + " " x = x + 1 yazdir(satir) y = y + 1 yazdir(renkli(" " + "─".tekrarla(EN * 2 + 2), 238)) yazdir(renkli(" ziyaret edilen hücre: " + metin(ziyaret), 245)) uyu(90) # ── Harita ──────────────────────────────────────────────────────────── duvar = [] uzaklik = [] yol = [] i = 0 iken i < EN * BOY: duvar.ekle(0) uzaklik.ekle(0 - 1) yol.ekle(0) i = i + 1 # Kenarlar ve rastgele engeller i = 0 iken i < EN * BOY: y = i // EN x = i - y * EN eger y == 0: duvar[i] = 1 eger y == BOY - 1: duvar[i] = 1 eger x == 0: duvar[i] = 1 eger x == EN - 1: duvar[i] = 1 eger duvar[i] == 0: eger rastgele.sayi(1, 100) <= 26: duvar[i] = 1 i = i + 1 baslangic = 1 * EN + 1 hedef =(BOY - 2) * EN +(EN - 2) duvar[baslangic] = 0 duvar[hedef] = 0 # ── BFS: dalga yayılımı ─────────────────────────────────────────────── # Sıra (kuyruk) ile en yakın hücreler önce işlenir; bu yüzden ilk # ulaşılan yol EN KISA yoldur. kuyruk = [] kuyruk.ekle(baslangic) uzaklik[baslangic] = 0 ziyaret = 1 bas = 0 varildi = yanlis iken bas < kuyruk.uzunluk(): su_an = kuyruk[bas] bas = bas + 1 eger su_an == hedef: varildi = dogru bas = kuyruk.uzunluk() degilse: y = su_an // EN x = su_an - y * EN komsular = [] komsular.ekle((y - 1) * EN + x) komsular.ekle((y + 1) * EN + x) komsular.ekle(y * EN + x - 1) komsular.ekle(y * EN + x + 1) dongu k icinde komsular: eger k >= 0: eger k < EN * BOY: eger duvar[k] == 0: eger uzaklik[k] < 0: uzaklik[k] = uzaklik[su_an] + 1 kuyruk.ekle(k) ziyaret = ziyaret + 1 eger ziyaret > 0: haritayi_ciz(duvar, uzaklik, yol, "DALGA YAYILIYOR (BFS)", ziyaret) # ── Yolu geri izle ──────────────────────────────────────────────────── eger varildi == dogru: su_an = hedef iken su_an != baslangic: yol[su_an] = 1 y = su_an // EN x = su_an - y * EN en_iyi = su_an adaylar = [] adaylar.ekle((y - 1) * EN + x) adaylar.ekle((y + 1) * EN + x) adaylar.ekle(y * EN + x - 1) adaylar.ekle(y * EN + x + 1) dongu k icinde adaylar: eger k >= 0: eger k < EN * BOY: eger uzaklik[k] >= 0: eger uzaklik[k] == uzaklik[su_an] - 1: en_iyi = k su_an = en_iyi haritayi_ciz(duvar, uzaklik, yol, "YOL GERİ İZLENİYOR", ziyaret) yol[baslangic] = 1 haritayi_ciz(duvar, uzaklik, yol, "EN KISA YOL BULUNDU", ziyaret) yazdir("") yazdir(renkli(" ✓ Hedefe " + metin(uzaklik[hedef]) + " adımda ulaşıldı; " + metin(ziyaret) + " hücre tarandı.", 78)) degilse: haritayi_ciz(duvar, uzaklik, yol, "HEDEFE ULAŞILAMADI", ziyaret) yazdir("") yazdir(renkli(" ✗ Engeller hedefi kapattı — BFS bütün erişilebilir hücreleri taradı.", 203)) yazdir("")