import java.util.*;
public class brut {
// Peta berisi S (start), G (goal), angka = biaya, dan 9 = tembok
static char[][] peta = {
{'S', '1', '1', '9', '1'},
{'1', '2', '1', '1', '1'},
{'1', '9', '2', '9', '1'},
{'1', '1', '2', '1', '1'},
{'1', '1', '1', '2', 'G'}
};
static int min = Integer.MAX_VALUE; // simpan biaya minimum
static List<List<String>> semuaJalur = new ArrayList<>(); // simpan semua jalur dengan biaya minimum
static List<String> jalurSekarang = new ArrayList<>(); // simpan jalur yang sedang dilalui
public static void main(String[] args) {
System.out.println("Biaya Minimum: " + biaya(peta));
System.out.println("Jalur dengan biaya minimum:");
// cetak semua jalur terbaik
for (List<String> jalur : semuaJalur) {
System.out.println(jalur);
}
}
// cari posisi 'S' lalu mulai pencarian
private static int biaya(char[][] arr) {
int x = 0, y = 0;
// cari koordinat 'S'
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (arr[i][j] == 'S') {
x = i;
y = j;
break;
}
}
}
// mulai jalur dari 'S'
jalan(x, y, 0);
return min;
}
// rekursi untuk menjelajah semua kemungkinan jalur
private static void jalan(int i, int j, int cost) {
// kondisi keluar: di luar peta, tembok '9', atau sudah pernah dikunjungi 'x'
if (i < 0 || i > 4 || j < 0 || j > 4 || peta[i][j] == '9' || peta[i][j] == 'x') return;
// jika sampai tujuan 'G'
if (peta[i][j] == 'G') {
if (cost < min) {
min = cost; // update biaya minimum
semuaJalur.clear(); // hapus jalur lama
semuaJalur.add(new ArrayList<>(jalurSekarang)); // simpan jalur baru
} else if (cost == min) {
semuaJalur.add(new ArrayList<>(jalurSekarang)); // simpan jika sama dengan min
}
return;
}
// simpan nilai asli cell
char temp = peta[i][j];
// konversi char ke integer biaya (S = 0)
int nilai = (temp == 'S') ? 0 : (temp - '0');
// tandai sudah dilewati agar tidak balik lagi
peta[i][j] = 'x';
// simpan koordinat ke jalur saat ini
jalurSekarang.add("(" + i + "," + j + ")");
// jelajah ke 4 arah
jalan(i - 1, j, cost + nilai); // atas
jalan(i + 1, j, cost + nilai); // bawah
jalan(i, j + 1, cost + nilai); // kanan
jalan(i, j - 1, cost + nilai); // kiri
// backtrack: hapus langkah terakhir & kembalikan nilai cell
jalurSekarang.remove(jalurSekarang.size() - 1);
peta[i][j] = temp;
}
}

Tidak ada komentar:
Posting Komentar