Add Tugas 2
This commit is contained in:
parent
1e71727b18
commit
52185f121f
97
Tugas 2
Normal file
97
Tugas 2
Normal file
@ -0,0 +1,97 @@
|
||||
Nama : Muhammad Lukman!Nurhakim
|
||||
NPM : 202510715211
|
||||
Kelas : F2A1
|
||||
Penjelasan
|
||||
Program ini dibuat untuk menyelesaikan permasalahan dalam menemukan jalur terpendek atau langkah minimum untuk keluar dari sebuah labirin (maze). Input program berupa matriks dua dimensi yang merepresentasikan peta labirin, di mana terdapat titik awal (mulai), jalan yang bisa dilewati, dinding/penghalang, dan titik keluar. Program akan menganalisis rute menggunakan algoritma pencarian jalur untuk menemukan jalan keluar yang paling efektif.
|
||||
Hasil akhir akan ditampilkan dalam format:
|
||||
s#i: x
|
||||
Dimana:
|
||||
i adalah nomor kasus atau baris input peta
|
||||
x adalah jumlah langkah minimum yang dibutuhkan untuk mencapai jalan keluar (atau -1 jika tidak ada jalan keluar)
|
||||
Tujuan
|
||||
Tujuan dari program ini adalah untuk memahami konsep representasi graf atau matriks dalam pemrograman, mempelajari implementasi algoritma pencarian seperti Breadth-First Search (BFS) untuk pencarian jalur terpendek, serta mengasah logika pemecahan masalah kompleks menggunakan Python.
|
||||
Bahasa yang Digunakan
|
||||
Python
|
||||
|
||||
|
||||
|
||||
from collections import deque
|
||||
|
||||
def cari_jalan_keluar():
|
||||
print("Masukkan labirin berbentuk matriks (misal 0 untuk jalan, 1 untuk dinding).")
|
||||
print("Gunakan 'S' untuk Start dan 'E' untuk Exit.")
|
||||
print("Ketik 'exit' setelah memasukkan labirin untuk memproses.\n")
|
||||
|
||||
kasus_ke = 1
|
||||
|
||||
while True:
|
||||
print(f"--- Input Kasus #{kasus_ke} ---")
|
||||
labirin = []
|
||||
|
||||
# Membaca input labirin baris demi baris hingga user mengetik 'done' atau 'exit'
|
||||
while True:
|
||||
baris_input = input("Masukkan baris (atau ketik 'done'/'exit' jika selesai): ").strip()
|
||||
if baris_input.lower() == 'exit':
|
||||
print("Program selesai. Terima kasih!")
|
||||
return
|
||||
if baris_input.lower() == 'done':
|
||||
break
|
||||
if baris_input:
|
||||
# Mengubah input string menjadi list karakter
|
||||
labirin.append(baris_input.split())
|
||||
|
||||
if not labirin:
|
||||
print("Labirin kosong, silakan masukkan data kembali.\n")
|
||||
continue
|
||||
|
||||
# Mencari koordinat Start (S) dan Exit (E)
|
||||
start = None
|
||||
exit_pos = None
|
||||
baris_maks = len(labirin)
|
||||
kolom_maks = len(labirin[0])
|
||||
|
||||
for r in range(baris_maks):
|
||||
for c in range(kolom_maks):
|
||||
if labirin[r][c] == 'S':
|
||||
start = (r, c)
|
||||
elif labirin[r][c] == 'E':
|
||||
exit_pos = (r, c)
|
||||
|
||||
if not start or not exit_pos:
|
||||
print("Error: Karakter 'S' (Start) atau 'E' (Exit) tidak ditemukan!\n")
|
||||
continue
|
||||
|
||||
# --- Algoritma BFS untuk mencari jalur terpendek ---
|
||||
queue = deque([(start[0], start[1], 0)]) # Menyimpan data: (baris, kolom, jumlah_langkah)
|
||||
dikunjungi = set([start])
|
||||
langkah_minimum = -1
|
||||
|
||||
# Arah gerakan: Atas, Bawah, Kiri, Kanan
|
||||
arah = [(-1, 0), (1, 0), (0, -1), (0, 1)]
|
||||
|
||||
while queue:
|
||||
r, c, langkah = queue.popleft()
|
||||
|
||||
# Jika sudah sampai di titik Exit (E)
|
||||
if (r, c) == exit_pos:
|
||||
langkah_minimum = langkah
|
||||
break
|
||||
|
||||
# Cek ke 4 arah gerakan
|
||||
for dr, dc in arah:
|
||||
nr, nc = r + dr, c + dc
|
||||
|
||||
# Pastikan koordinat baru tidak keluar dari batas labirin
|
||||
if 0 <= nr < baris_maks and 0 <= nc < kolom_maks:
|
||||
# Pastikan belum pernah dikunjungi dan BUKAN dinding ('1')
|
||||
if (nr, nc) not in dikunjungi and labirin[nr][nc] != '1':
|
||||
dikunjungi.add((nr, nc))
|
||||
queue.append((nr, nc, langkah + 1))
|
||||
|
||||
# Menampilkan hasil sesuai format s#i: x
|
||||
print(f"\ns#{kasus_ke}: {langkah_minimum}\n")
|
||||
kasus_ke += 1
|
||||
|
||||
# Menjalankan program
|
||||
if __name__ == "__main__":
|
||||
cari_jalan_keluar()
|
||||
Loading…
x
Reference in New Issue
Block a user