#include #define forn(i, n) for(int i = 0; i < (int) (n); i++) #define dforn(i, n) for(int i = (int) (n) - 1; i >= 0; i--) using namespace std; typedef double ld; typedef vector vec; typedef vector mat; int n, m, k, ia, ja; int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; mat mul(mat const &a, mat const &b) { int n = a.size(); mat c(n, vec(n)); forn(i, n) forn(j, n) forn(k, n) c[i][j] += a[i][k] * b[k][j]; return c; } int flat(int i, int j) { return i * m + j; } int main() { cin >> n >> m >> k; vector t(n); mat r(n * m, vec(n * m)); forn(i, n) cin >> t[i]; forn(i, n) forn(j, m) if(t[i][j] == 'A') { ia = i; ja = j; t[i][j] = 'O'; } forn(i, k){ int i1, j1, i2, j2; cin >> i1 >> j1 >> i2 >> j2; i1 --; i2 --; j1 --; j2 --; int ady = 0; forn(h, 4) if(i2 + dx[h] >= 0 && i2 + dx[h] < n && j2 + dy[h] >= 0 && j2 + dy[h] < m && t[i2 + dx[h]][j2 + dy[h]] != '#') ady ++; forn(h, 4) if(i2 + dx[h] >= 0 && i2 + dx[h] < n && j2 + dy[h] >= 0 && j2 + dy[h] < m && t[i2 + dx[h]][j2 + dy[h]] != '#') { r[flat(i2 + dx[h], j2 + dy[h])][flat(i1, j1)] += 1.0 / ady; } ady = 0; forn(h, 4) if(i1 + dx[h] >= 0 && i1 + dx[h] < n && j1 + dy[h] >= 0 && j1 + dy[h] < m && t[i1 + dx[h]][j1 + dy[h]] != '#') ady ++; forn(h, 4) if(i1 + dx[h] >= 0 && i1 + dx[h] < n && j1 + dy[h] >= 0 && j1 + dy[h] < m && t[i1 + dx[h]][j1 + dy[h]] != '#') { r[flat(i1 + dx[h], j1 + dy[h])][flat(i2, j2)] += 1.0 / ady; } t[i1][j1] = t[i2][j2] = 'T'; } forn(i, n) forn(j, m) { if(t[i][j] == 'O') { int ady = 0; forn(h, 4) if(i + dx[h] >= 0 && i + dx[h] < n && j + dy[h] >= 0 && j + dy[h] < m && t[i + dx[h]][j + dy[h]] != '#') ady ++; forn(h, 4) if(i + dx[h] >= 0 && i + dx[h] < n && j + dy[h] >= 0 && j + dy[h] < m && t[i + dx[h]][j + dy[h]] != '#') { r[flat(i + dx[h], j + dy[h])][flat(i, j)] += 1.0 / ady; } } if(t[i][j] == '%') r[flat(i, j)][flat(i, j)] = 1; } forn(i, 16) r = mul(r, r); ld res = 0; forn(i, n) forn(j, m) if(t[i][j] == '%') res += r[flat(i, j)][flat(ia, ja)]; cout << setprecision(12) << fixed << res << endl; return 0; }