127 lines
2.6 KiB
Java
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]++;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|