#include using namespace std; const double eps = 1e-10; const int N = 777; char s[N][N]; double a[N][N]; double ans[N]; int who[N]; pair go[N][N]; int main() { int h, w, k; scanf("%d %d %d", &h, &w, &k); for (int i = 0; i < h; i++) { scanf("%s", s[i]); } for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { go[i][j] = make_pair(i, j); } } for (int i = 0; i < k; i++) { int a, b, c, d; scanf("%d %d %d %d", &a, &b, &c, &d); a--; b--; c--; d--; go[a][b] = make_pair(c, d); go[c][d] = make_pair(a, b); } for (int i = 0; i < h * w; i++) { a[i][i] = 1.0; } int start = -1; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { if (s[i][j] == '#' || s[i][j] == '*') { continue; } if (s[i][j] == 'A') { start = i * w + j; } if (s[i][j] == '%') { a[i * w + j][h * w] = 1.0; continue; } vector < pair > z; for (int dx = -1; dx <= 1; dx++) { for (int dy = -1; dy <= 1; dy++) { if (dx * dx + dy * dy == 1) { int xk = i + dx; int yk = j + dy; if (xk >= 0 && yk >= 0 && xk < h && yk < w && s[xk][yk] != '#') { z.push_back(go[xk][yk]); } } } } if (z.empty()) { continue; } int sz = z.size(); for (auto &p : z) { a[i * w + j][p.first * w + p.second] -= 1.0 / sz; } } } int n = h * w; int c = 0; for (int r = 0; r < n; r++) { who[r] = -1; while (c < n) { int id = r; for (int i = r; i < n; i++) { if (fabs(a[i][c]) > fabs(a[id][c])) { id = i; } } if (fabs(a[id][c]) < eps) { c++; continue; } for (int j = c; j <= n; j++) { swap(a[r][j], a[id][j]); } for (int i = r + 1; i < n; i++) { double coeff = a[i][c] / a[r][c]; for (int j = c; j <= n; j++) { a[i][j] -= coeff * a[r][j]; } } who[r] = c; break; } } for (int r = n - 1; r >= 0; r--) { int c = who[r]; if (c == -1) { continue; } ans[c] = a[r][n] / a[r][c]; for (int i = r - 1; i >= 0; i--) { a[i][n] -= a[i][c] * ans[c]; a[i][c] = 0; } } printf("%.17f\n", ans[start]); return 0; }