#include using namespace std; #define MAXN 510 #define INF 0x3f3f3f3f #define mo 1000000007 typedef long long LL; int n, m, h, w, k; int Rans[MAXN]; int nx[21][21][2]; char mp[21][21]; int p[21][21]; double f[MAXN][MAXN]; bool vis[21][21]; int g[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; void DFS(int i, int j) { if(vis[i][j]) return; vis[i][j] = true; if(mp[i][j] == '%' || mp[i][j] == '*') return; if(nx[i][j][0]){ DFS(nx[i][j][0], nx[i][j][1]); return; } int x, y, z; for(z = 0; z < 4; ++z){ x = i + g[z][0]; y = j + g[z][1]; if(x < 1 || x > h || y < 1 || y > w || mp[x][y] == '#' || vis[x][y]) continue; DFS(x, y); } } void Init() { int i, j, x, y, z, x1, y1, x2, y2; scanf("%d %d %d", &h, &w, &k); n = w * h + 1; m = w * h; for(i = 1; i <= h; ++i) for(j = 1; j <= w; ++j) scanf(" %c", &mp[i][j]); for(i = 1; i <= k; ++i){ scanf("%d %d %d %d", &x1, &y1, &x2, &y2); nx[x1][y1][0] = x2; nx[x1][y1][1] = y2; nx[x2][y2][0] = x1; nx[x2][y2][1] = y1; } for(i = 1; i <= h; ++i) for(j = 1; j <= w; ++j) if(mp[i][j] == 'A') DFS(i, j); for(i = 1; i <= h; ++i) for(j = 1; j <= w; ++j){ if(mp[i][j] == '#') continue; for(z = 0; z < 4; ++z){ x = i + g[z][0]; y = j + g[z][1]; if(x < 1 || x > h || y < 1 || y > w || mp[x][y] == '#') continue; ++p[i][j]; } } for(i = 1; i <= h; ++i) for(j = 1; j <= w; ++j){ if(mp[i][j] == '#' || !vis[i][j]) continue; if(nx[i][j][0]) x1 = nx[i][j][0], y1 = nx[i][j][1]; else x1 = i, y1 = j; if(mp[i][j] != '%' && mp[i][j] != '*') f[(i - 1) * w + j][(i - 1) * w + j] = 1; f[n][(i - 1) * w + j] = 1; for(z = x2 = 0; z < 4; ++z){ x = x1 + g[z][0]; y = y1 + g[z][1]; if(x < 1 || x > h || y < 1 || y > w || mp[x][y] == '#' || mp[x][y] == '%' || mp[x][y] == '*') continue; f[(i - 1) * w + j][(x - 1) * w + y] = -1 / double(p[x][y]); ++x2; } if(!p[i][j] && x2){ f[(i - 1) * w + j][(i - 1) * w + j] = 0; } if(!p[i][j] && !x2){ f[(i - 1) * w + j][(i - 1) * w + j] = 1; } } f[n][m + 1] = 1; } bool Gauss() { int i, j, k, q; double Max, res; for(i = 1; i <= n; ++i){ k = -1; Max = 0; for(j = 1; j <= m; ++j) if((res = fabs(f[i][j])) > Max) Max = res, k = j; if(k == -1){ if(fabs(f[i][m + 1]) < 1e-12) continue; else return false; } res = f[Rans[k] = i][k]; for(j = 1; j <= m + 1; ++j) if(f[i][j]) f[i][j] /= res; for(j = 1; res = f[j][k], j <= n; ++j){ if(i == j) continue; for(q = 1; q <= m + 1; ++q) f[j][q] -= res * f[i][q]; } } return true; } int main() { //freopen("in.txt", "r", stdin); Init(); if(!Gauss()) printf("0\n"); else{ double ans = 0, res = 0; for(int i = 1; i <= m; ++i) res += f[n][i]; for(int i = 1; i <= h; ++i) for(int j = 1; j <= w; ++j) if(mp[i][j] == '%') if(res > 0) ans += f[n][m + 1] / res * f[n][(i - 1) * w + j]; printf("%.8f\n", ans); } return 0; }