Files
competitive-programming/solutions/practice/Minesweeper.java
2026-04-17 19:50:58 -05:00

127 lines
2.6 KiB
Java

// 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]++;
}
}
}
}
}