#include #include #include using namespace std; #define MAXN 50000+5 int T, M, N, K; int seenid = 0; vector comps; int di[] = {1, -1, 0, 0}; int dj[] = {0, 0, -1, 1}; int seen[MAXN]; string maze[MAXN]; bool ok(int i, int j) { return i >= 0 && i < M && j >= 0 && j < N && maze[i][j] != '#' && seen[ N*i + j ] != seenid; } int dfs(int i, int j) { seen[ N*i + j ] = seenid; int cnt = 1; for (int k = 0; k < 4; k++) { int ni = i + di[k], nj = j + dj[k]; if ( !ok(ni, nj) ) continue; cnt += dfs(ni, nj); } return cnt; } #ifdef BRUTE double dp[1<<18]; int vis[1<<18]; double E(int mask) { if (vis[mask] == seenid) return dp[mask]; vis[mask] = seenid; double sum = 0, ans = 0; for (int i = 0; i < K; i++) { if ((1<> maze[i]; } for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { if ( !ok(i, j) ) continue; comps.push_back( dfs(i, j) ); } } K = (int)comps.size(); #ifdef BRUTE printf("%.10f\n", E(0)); #endif #ifndef BRUTE long double ans = 1.0; for (int i = 1; i < K; i++) { ans += (comps[i] * (long double)1.0) / (comps[i] + comps[0]); } printf("%.10Lf\n", ans); #endif } }