#include using namespace std; typedef long long ll; typedef vector vl; typedef vector vvl; typedef pair pll; typedef vector vb; const ll oo = 0x3f3f3f3f3f3f3f3f; const double eps = 1e-9; #define sz(c) ll((c).size()) #define all(c) begin(c), end(c) #define FOR(i,a,b) for (ll i = (a); i < (b); i++) #define FORD(i,a,b) for (ll i = (b)-1; i >= (a); i--) #define mp make_pair #define mt make_tuple #define pb push_back #define eb emplace_back #define xx first #define yy second #define has(c,i) ((c).find(i) != end(c)) #define DBGDO(X) ({ if(1) cerr << "DBGDO: " << (#X) << " = " << (X) << endl; }) const ll di[] = {-1,1,0,0}, dj[] = {0,0,-1,1}; vector solve(vector> a, vector b) { ll n = sz(a); vl p(n); FOR(i,0,n) p[i] = i; FOR(c,0,n) { ll piv = c; FOR(r,c+1,n) if (abs(a[p[r]][c]) > abs(a[p[piv]][c])) piv = r; swap(p[piv],p[c]); FOR(r,c+1,n) { a[p[r]][c] /= a[p[c]][c]; FOR(i,c+1,n) a[p[r]][i] -= a[p[r]][c] * a[p[c]][i]; } } vector x(1, b[p[0]]); FOR(i,1,n) { x.pb(b[p[i]]); FOR(j,0,i) x[i] -= a[p[i]][j] * x[j]; } FORD(i,0,n) { FOR(j,i+1,n) x[i] -= a[p[i]][j] * x[j]; x[i] /= a[p[i]][i]; } return x; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); ll m, n, k; cin >> m >> n >> k; vector maze(m); FOR(i,0,m) cin >> maze[i]; map tunnel; while (k--) { ll i1, j1, i2, j2; cin >> i1 >> j1 >> i2 >> j2; i1--, j1--, i2--, j2--; tunnel[mp(i1,j1)] = mp(i2,j2); tunnel[mp(i2,j2)] = mp(i1,j1); } ll si = -1, sj = -1; FOR(i,0,m) FOR(j,0,n) if (maze[i][j] == 'A') { maze[i][j] = 'O'; si = i, sj = j; } ll N = m*n + 2; vector> A(N,vector(N)); auto I = [&](ll i, ll j) { return i*n + j; }; FOR(i,0,m) FOR(j,0,n) { if (maze[i][j] == '#') A[I(i,j)][m*n+1] = 1; if (maze[i][j] == '*') A[I(i,j)][m*n+1] = 1; if (maze[i][j] == '%') A[I(i,j)][m*n] = 1; if (maze[i][j] == 'O') { ll deg = 0; FOR(k,0,4) { ll ni = i+di[k], nj = j+dj[k]; if (ni < 0 || ni >= m || nj < 0 || nj >= n) continue; if (maze[ni][nj] != '#') deg++; } if (deg == 0) { A[I(i,j)][m*n+1] = 1; continue; } double d = deg; FOR(k,0,4) { ll ni = i+di[k], nj = j+dj[k]; if (ni < 0 || ni >= m || nj < 0 || nj >= n) continue; if (maze[ni][nj] == '#') continue; if (maze[ni][nj] == '%') A[I(i,j)][m*n] += 1/d; else { if (has(tunnel,mp(ni,nj))) tie(ni,nj) = tunnel[mp(ni,nj)]; A[I(i,j)][I(ni,nj)] += 1/d; } } } } vector> B(m*n,vector(m*n)); vector c(m*n); c[I(si,sj)] = 1; FOR(i,0,m*n) FOR(j,0,m*n) B[j][i] = (i==j) - A[i][j]; vector x = solve(B,c); double res = 0; FOR(i,0,m*n) res += x[i] * A[i][m*n]; cout << fixed << setprecision(20) << res << endl; }