diff --git a/solutions/practice/Minesweeper.java b/solutions/practice/Minesweeper.java new file mode 100644 index 0000000..983f24d --- /dev/null +++ b/solutions/practice/Minesweeper.java @@ -0,0 +1,126 @@ +// General imports + +import java.util.*; +import java.io.*; +import java.math.*; + +public class Minesweeper { + static char[][] input; + static int poss = 0; + static int[][] safe; + static int r; + static int c; + static int b; + + public static void main(String[] args) { + + Scanner sc = new Scanner(System.in); + + // Write code here + + r = sc.nextInt(); + c = sc.nextInt(); + b = sc.nextInt(); + + input = new char[r][c]; + safe = new int[r][c]; + + for (int i = 0; i < r; i++) { + String s = sc.next(); + for (int j = 0; j < c; j++) { + input[i][j] = s.charAt(j); + safe[i][j] = 0; + } + } + + sc.close(); + + solve(0, input, 0); + if (poss == 0) { + System.out.println("0.000"); + } else { + double maxProb = (double) safe[0][0] / (double) poss; + + for (int i = 0; i < safe.length; i++) { + for (int j = 0; j < safe[i].length; j++) { + maxProb = Math.max(maxProb, (double) (safe[i][j]) / (double) poss); + } + } + + String s = String.format("%.3f", maxProb); + System.out.println(s); + } + + } + + public static void solve(int index, char[][] grid, int bombs) { + + if (index >= r * c) { + if (bombs == b && isValid(grid)) { + addPoss(grid); + } + return; + } + + int row = (int) Math.floor(index / c); + int col = (index % c); + + if (bombs > b) + return; + + char[][] gridCopy = new char[r][c]; + + for (int i = 0; i < r; i++) { + for (int j = 0; j < c; j++) { + gridCopy[i][j] = grid[i][j]; + } + } + + if (gridCopy[row][col] == '#') { + gridCopy[row][col] = 'b'; + solve(index + 1, gridCopy, bombs + 1); + gridCopy[row][col] = '#'; + solve(index + 1, gridCopy, bombs); + } else { + solve(index + 1, gridCopy, bombs); + } + + return; + + } + + public static boolean isValid(char[][] grid) { + for (int i = 0; i < grid.length; i++) { + for (int j = 0; j < grid[i].length; j++) { + if (Character.isDigit(grid[i][j])) { + int total = grid[i][j] - '0'; + int cand = 0; + for (int l = -1; l <= 1; l++) { + for (int m = -1; m <= 1; m++) { + if (i + l < grid.length && i + l >= 0 && j + m < grid[i].length && j + m >= 0) { + if (grid[i + l][j + m] == 'b') + cand++; + } + } + } + if (cand != total) + return false; + } + } + } + return true; + } + + public static void addPoss(char[][] grid) { + poss++; + for (int i = 0; i < grid.length; i++) { + for (int j = 0; j < grid[i].length; j++) { + if (grid[i][j] == '#') { + safe[i][j]++; + } + + } + } + } + +}