Algoritmalar · 144 satır
Yol bulma
Genişlik öncelikli arama: labirentte dalga yayılır, en kısa yol geri izlenir.
Önizleme · 0.6.0 — dil 1.0 öncesidir; sözdizimi ve kütüphane değişebilir. Buradaki her örnek derlenerek sınanır.
Çalıştırın
Uçbirim
kabalang calistir 05_yol_bulma.kblKaynak kod
05_yol_bulma.kbl
# ╔═══════════════════════════════════════════════════════════════════╗
# ║ 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("")