🧩 Algoritma İleri ⏱ Tahmini: 60 dk

Labirent Çözme ve Geri İzleme (Backtracking) Algoritması

Backtracking (Geri İzleme) algoritması nedir? 2D matris üzerinde labirent çözümü, çıkmaz sokakları budama (pruning) ve Python Micromouse robot simülasyonu.

📅 16 Ekim 2026 • 👁 0 kez görüntülendi • ✅ Ücretsiz Ders

Bir labirentte kaybolduğunuzda ne yaparsınız? Bir yola girer, ilerler, eğer karşınıza çıkmaz bir sokak (duvar) çıkarsa geri adım atar ve başka bir alternatifi denersiniz. İnsan aklının bu sezgisel problem çözme tekniği, bilgisayar bilimlerinde **Geri İzleme (Backtracking)** olarak adlandırılan son derece güçlü bir arama algoritmasının temelini oluşturur. Yapay zekalı mikro farelerin (Micromouse) labirent şampiyonalarından Sudoku bulmaca çözücülerine ve satrançta N-Vezir problemine kadar uzanan bu rehberde, 2 boyutlu bir matris üzerinde labirent çözme algoritmasının tüm aşamalarını adım adım kodlayacağız.

---

1. Backtracking (Geri İzleme) Nedir?

Geri izleme; tüm olası çözüm yollarını sistematik olarak araştıran, ancak bir yolun hedefe ulaşamayacağı anlaşıldığı anda **o yolu terk edip bir önceki karar noktasına geri dönen (Pruning / Budama)** özyinelemeli bir optimizasyon tekniğidir.

Brute Force (Kaba Kuvvet) ile Farkı:

Kaba kuvvet her yolu körü körüne sonuna kadar dener. Backtracking ise "Bu adım duvara çarpıyor, o halde bu yönde daha fazla ilerlememe gerek yok" diyerek milyonlarca gereksiz hesaplamayı tek bir satırda budar!

---

2. Labirentin 2 Boyutlu Matris Olarak Temsili

Bilgisayarda bir labirenti temsil etmek için $N imes N$ boyutunda 2 boyutlu bir tamsayı dizisi (Matrix) kullanılır:

  • `0`: Açık, yürünebilir yol.
  • `1`: Taş duvar (Geçilemez engel).
  • `9`: Bitiş / Çıkış noktası (Hedef).
  • `2`: Robotun izlediği doğru rota (İz bırakma).
  • Giriş (0,0) ──> [ 0,  1,  0,  0 ]
                    [ 0,  0,  0,  1 ]
                    [ 1,  0,  1,  0 ]
                    [ 0,  0,  0,  9 ] <── Çıkış (3,3)

    ---

    3. Güvenli Adım Kontrolü (isSafe Fonksiyonu)

    Robotun bir $(x, y)$ koordinatına adım atabilmesi için 3 şartın aynı anda sağlanması gerekir:

    1. $x$ ve $y$ koordinatları matris sınırları içinde olmalıdır ($0 \le x < N$ ve $0 \le y < N$).

    2. Hedef hücre duvar olmamalıdır (`Labirent[x][y] != 1`).

    3. Hedef hücre daha önce ziyaret edilmemiş olmalıdır (`Labirent[x][y] != 2`).

    ---

    4. Tam ve Çalışan Python Kodu

    def is_safe(maze, x, y, n):
        # Matris sınırları içinde mi ve duvar değil mi?
        return 0 <= x < n and 0 <= y < n and maze[x][y] == 0
    
    def solve_maze_util(maze, x, y, n, sol):
        # Taban Durumu: Sağ alt köşedeki hedefe ulaşıldı mı?
        if x == n - 1 and y == n - 1 and maze[x][y] == 0:
            sol[x][y] = 1
            return True
    
        # Geçerli bir hücrede miyiz?
        if is_safe(maze, x, y, n):
            # Hücreyi çözüm yolunun parçası olarak işaretle
            sol[x][y] = 1
    
            # 1. Aşağıya gitmeyi dene (x + 1)
            if solve_maze_util(maze, x + 1, y, n, sol):
                return True
    
            # 2. Sağa gitmeyi dene (y + 1)
            if solve_maze_util(maze, x, y + 1, n, sol):
                return True
    
            # Çıkmaz sokak! Geri adım at (BACKTRACKING)
            sol[x][y] = 0
            return False
    
        return False
    
    def solve_maze(maze):
        n = len(maze)
        sol = [[0 for _ in range(n)] for _ in range(n)]
    
        if not solve_maze_util(maze, 0, 0, n, sol):
            print("Labirentin çıkış yolu YOKTUR!")
            return False
    
        print("--- BAŞARILI ÇIKIŞ ROTASI (1'ler Rota) ---")
        for row in sol:
            print(row)
        return True
    
    # Test Labirenti (0: Yol, 1: Duvar)
    labirent = [
        [0, 1, 0, 0],
        [0, 0, 0, 1],
        [1, 0, 1, 0],
        [1, 0, 0, 0]
    ]
    
    solve_maze(labirent)

    ---

    5. Robotik Dünyasındaki Yeri: Micromouse Yarışmaları

    Tüm dünyada düzenlenen **Micromouse** yarışmalarında, otonom küçük fare robotlar $16 imes 16$'lık devasa ahşap bir labirentin içine bırakılır. Robotlar önce sağ el kuralı veya DFS ile labirenti keşfeder, ardından Backtracking ve Flood-Fill (Su Doldurma) algoritmalarıyla çıkmaz sokakları hafızasından silerek en hızlı rotayı hesaplar ve rekor sürelerde labirenti tamamlar.

    ---

    6. Kendini Geliştirme Görevi (Challenge)

    **Sudoku Çözücü:** 9x9'luk boş hücreleri olan bir Sudoku bulmacasını Backtracking tekniğiyle çözen bir fonksiyon yazın. Satır, sütun ve 3x3'lük blok kurallarını `is_safe` kontrolüyle birleştirin!

    ---

    ---

    7. N-Vezir (N-Queens) Problemi ile Backtracking Mantığının Zirvesi

    Backtracking mantığının satranç tahtasındaki en meşhur uygulaması **N-Vezir Problemi**dir:

  • **Problem:** $N imes N$'lik bir satranç tahtasına, hiçbir vezir diğerini tehdit etmeyecek (aynı satır, sütun veya çaprazda olmayacak) şekilde $N$ adet veziri yerleştirebilir misiniz?
  • **Backtracking Çözümü:**
  • 1. 1. satıra bir vezir koyulur.

    2. 2. satırda tehdit altında olmayan ilk güvenli kareye ikinci vezir koyulur.

    3. Eğer bir satırda hiçbir kareye vezir koyulamıyorsa (çıkmaz sokak!), bir önceki satırdaki vezir bir sonraki sütuna kaydırılır (Geri Adım - Backtrack).

    4. 8x8'lik standart tahtada bu budama yöntemi sayesinde $4.4$ milyar olası kombinasyon yerine sadece birkaç bin kontrolle tüm 92 geçerli çözüm saniyeler içinde bulunur.

    ---

    Sonuç

    Geri izleme (Backtracking), karmaşık karar ağaçlarını budayarak çözüme ulaşmanın en akılcı yoludur. Hata yapıldığında geri dönüp alternatifleri deneme refleksi, algoritmik düşüncenin en büyük kazanımıdır. Diğer projelerimizi [Arduino Projeleri](/projeler) sayfamızda bulabilirsiniz!

    Sorun mu yaşadınız veya aklınıza takılan bir nokta mı var?

    Discord topluluğumuza katılarak diğer geliştiriciler ve eğitmenlerle yardımlaşabilirsiniz.

    Discord'da Soru Sor →