Permainan Pencarian Kata dalam Matriks 2D
Pasti sudah pada tau kan permainan yang ada pada gambar di atas. Ini adalah permainan pencarian kata-kata yang ada di dalam sejumlah huruf. Permainan ini sangat sederhana dan seharusnya untuk membuat permainan ini dibutuhkan kamus kata-kata, namun yang akan disajikan di sini hanyalah sebagai contoh sederhana dari permainan kata dengan bahasa pemrograman java.
Saat program dijalankan maka akan program akan membaca inputan berupa file dan kemudian menjalankan semua perintah dan menuliskan output dalam bentuk file dan print di layar.
Selanjutnya akan dibahas mengenai beberapa bagian kode yang mungkin perlu diketahui.
String fileInput = "input.in"; String fileOutput = "output.txt";
Nama file berisi inputan dan hasil keluaran
FileReader fileReader = new FileReader(fileInput); BufferedReader bufferedReader = new BufferedReader(fileReader); FileWriter fileWriter = new FileWriter(fileOutput); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
Persiapan untuk membaca file dan menulis ke dalam file
for (int j = 0; j<row;j++){ currLine = bufferedReader.readLine(); for (int k = 0; k < col; k++){ //System.out.println(currLine.charAt(k)); arrGrid[j][k] = (currLine.charAt(k)); } }
Loop untuk pencarian huruf pertama jika sesuai dengan kata yang dicari maka akan diteruskan ke pencarian arah
Pencarian 8 Arah
Dalam pencarian dalam bentuk titik dari matriks bisa juga digunakan untuk piksel gambar, pencarian secara baris per baris dilakukan dengan arah pergerakan titik. Ada yang 8 arah dan 4 arah, arah tersebut sama dengan arah mata angin. Pencarian 8 arah dapat di lihat sesuai gambar arah mata angin di bawah. Dan untuk pencarian 4 arah hanya tinggal menggunakan 4 arah saja Utara, Selatan, Barat, dan Timur.
Pertama Buat Array Untuk Pergerakan
//indeks 8 directions int[] rowDir= {-1,-1,-1,0,0,1,1,1}; int[] colDir = {-1, 0, 1, -1,1,-1,0,1};
Kode di atas digunakan untuk menentukan pergerakan arah titik. Di dalam array terdapat 8 arah pergerakan.
//loop 8 directions for (int i = 0; i<8; i++){ result = true; j=1; //get initial direction tmpRow = row; tmpCol = col;
selanjutnya siapkan loop untuk melakukan pencarian di 8 arah.
while ((j < word.length()) && (result) ){ //move to the direction tmpRow = tmpRow + rowDir[i]; tmpCol = tmpCol + colDir[i]; //check if out of bound if (tmpRow < 0 || tmpCol < 0 || tmpRow > maxRow-1 || tmpCol > maxCol-1){ result = false; }else{ //check if match or not if (grid2D[tmpRow][tmpCol] != word.charAt(j)){ result = false; } } j++; }
Kemudian siapkan loop untuk pencarian kata. Kata di cari terus sesuai arah ditemukannya huruf yang sama.
Full Code
import java.io.*; public class Test5{ public static int count=0; public static void main(String[] args){ String fileInput = "input.in"; String fileOutput = "output.txt"; try{ FileReader fileReader = new FileReader(fileInput); BufferedReader bufferedReader = new BufferedReader(fileReader); FileWriter fileWriter = new FileWriter(fileOutput); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); int cases = Integer.parseInt(bufferedReader.readLine()); int row, col; char arrGrid[][]; String currLine; String word; for (int i=0; i<cases;i++){ //initialize count count = 0; //get row and col row = Integer.parseInt(bufferedReader.readLine()); col = Integer.parseInt(bufferedReader.readLine()); //System.out.println(cases + " " + row + " " + col); //creating grid arrGrid = new char[row][col]; for (int j = 0; j<row;j++){ currLine = bufferedReader.readLine(); for (int k = 0; k < col; k++){ //System.out.println(currLine.charAt(k)); arrGrid[j][k] = (currLine.charAt(k)); } } //get the word word = bufferedReader.readLine(); for (int x = 0; x < row; x++){ for (int y = 0; y < col; y++){ if (arrGrid[x][y] == word.charAt(0)){ search8Directions(arrGrid, x,y,word); } } } System.out.println("Case " + (i+1) + ": " + count); bufferedWriter.write("Case " + (i+1) + ": " + count +"\n"); bufferedWriter.flush(); } }catch(IOException e){ } } public static void search8Directions (char grid2D[][], int row, int col, String word){ //indeks 8 directions int[] rowDir= {-1,-1,-1,0,0,1,1,1}; int[] colDir = {-1, 0, 1, -1,1,-1,0,1}; int maxRow = grid2D.length; int maxCol = grid2D[0].length; boolean result = true; int tmpRow=0, tmpCol=0, j; //loop 8 directions for (int i = 0; i<8; i++){ result = true; j=1; //get initial direction tmpRow = row; tmpCol = col; while ((j < word.length()) && (result) ){ //move to the direction tmpRow = tmpRow + rowDir[i]; tmpCol = tmpCol + colDir[i]; //check if out of bound if (tmpRow < 0 || tmpCol < 0 || tmpRow > maxRow-1 || tmpCol > maxCol-1){ result = false; }else{ //check if match or not if (grid2D[tmpRow][tmpCol] != word.charAt(j)){ result = false; } } j++; } if (result){ System.out.println("found at : " + row + "," + col + " to " + tmpRow +"," + tmpCol); count++; } } } }
File input
2 4 5 catac tacca atttt ccccc cat 5 5 gldol oolol lllll ddddd ggggg gold
ini adalah isi dari file input. Baris pertama menunjukkan berapa banyak case yang mau di selesaikan. Kemudian baris kedua menunjukkan baris dari matriks huruf-huruf. Kemudian baris ketiga menunjukkan Kolom matriks. Baris selanjutnya adalah isi matriks huruf-huruf. Kemudian yang terakhir kata yang dicari.
Hasil Keluaran
Hasil keluaran di dalam file output hanya menampilkan jumlah kata yang sesuai pencarian ditemukan
Case 1: 6 Case 2: 2
Sisanya akan ditampilkan di layar untuk letak kata yang ditemukan beserta indeks matriks