#include <bits/stdc++.h> #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define FORD(i, a, b) for(int i = (a); i >= (b); --i) #define VAR(v, i) __typeof(i) v=(i) #define FORE(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i) #define all(v) (v).begin(),(v).end() #define PII pair<int,int> #define mp make_pair #define st first #define nd second #define pb push_back #define lint long long int #define VI vector<int> using namespace std; template<class TH> void _dbg(const char *sdbg, TH h){cerr<<sdbg<<"="<<h<<"\n";} template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) { while(*sdbg!=',')cerr<<*sdbg++;cerr<<"="<<h<<","; _dbg(sdbg+1, a...); } template<class T> ostream &operator<<(ostream &os, vector<T> V){ os<<"[";for(auto vv:V)os<<vv<<",";return os<<"]"; } template<class L, class R> ostream &operator<<(ostream &os, pair<L,R> P) { return os << "(" << P.st << "," << P.nd << ")"; } #define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__) #define make( x) int (x); scanf("%d",&(x)); #define make2( x, y) int (x), (y); scanf("%d%d",&(x),&(y)); #define make3(x, y, z) int (x), (y), (z); scanf("%d%d%d",&(x),&(y),&(z)); #define make4(x, y, z, t) int (x), (y), (z), (t); scanf("%d%d%d%d",&(x),&(y),&(z),&(t)); #define makev(v,n) VI (v); FOR(i,0,(n)) { make(a); (v).pb(a);} #define IOS ios_base::sync_with_stdio(0) #define HEAP priority_queue #define read( x) scanf("%d",&(x)); #define read2( x, y) scanf("%d%d",&(x),&(y)); #define read3(x, y, z) scanf("%d%d%d",&(x),&(y),&(z)); #define read4(x, y, z, t) scanf("%d%d%d%d",&(x),&(y),&(z),&(t)); #define readv(v,n) FOR(i,0,(n)) { make(a); (v).pb(a);} #define jeb fflush(stdout) const int max_n = 1e5 + 5; char s[25][25]; int nr[25][25]; int n, m, k; int V = 3; double ile[405][405]; double pom[405][405]; const int die = 2; const int ex = 1; const int start = 0; int dx[] = {0,0,1,-1}; int dy[] = {1,-1,0,0}; PII tunel[25][25]; void square() { FOR(i,0,V) FOR(j,0,V) pom[i][j] = 0.; FOR(i,0,V) FOR(j,0,V) { FOR(k,0,V) pom[i][j] += ile[i][k] * ile[k][j]; } FOR(i,0,V) FOR(j,0,V) ile[i][j] = pom[i][j]; } bool inside(int x, int y) { return (x>=0 && y>=0 && x<n && y<m); } int main() { scanf("%d%d%d", &n, &m, &k); FOR(i,0,n) { scanf("%s", s[i]); } FOR(i,0,n) FOR(j,0,m) nr[i][j] = -1; FOR(i,0,n) FOR(j,0,m) tunel[i][j] = mp(-1,-1); FOR(i,0,n) { FOR(j,0,m) { if (s[i][j] == '*') { nr[i][j] = die; } else if (s[i][j]=='A') { nr[i][j] = start; } else if (s[i][j] == 'O') { nr[i][j] = V++; } else if (s[i][j] == '%') { nr[i][j] = ex; } } } FOR(i,0,k) { make4(a, b, c, d); a--; b--; c--; d--; tunel[a][b] = mp(c,d); tunel[c][d] = mp(a,b); } FOR(i,0,n) FOR(j,0,m) { if (nr[i][j] == -1) continue; if (nr[i][j] == die) { ile[die][die] = 1; } else if (nr[i][j] == ex) { ile[ex][ex] = 1; } else { if (tunel[i][j]==mp(-1,-1)) { vector<PII> mvs; FOR(u,0,4) { int ni = i + dx[u]; int nj = j + dy[u]; if (inside(ni, nj) && nr[ni][nj]!=-1) { mvs.pb(mp(ni,nj)); } } if (mvs.size() != 0) { double p = 1./(mvs.size()); FORE(u,mvs) { ile[nr[i][j]][nr[u->st][u->nd]] += p; } } else { ile[nr[i][j]][nr[i][j]] = 1.; } } else { int xi = tunel[i][j].st; int xj = tunel[i][j].nd; vector<PII> mvs; FOR(u,0,4) { int ni = xi + dx[u]; int nj = xj + dy[u]; if (inside(ni, nj) && nr[ni][nj]!=-1) { mvs.pb(mp(ni,nj)); } } if (mvs.size() != 0) { double p = 1./(mvs.size()); FORE(u,mvs) { ile[nr[i][j]][nr[u->st][u->nd]] += p; } } else { ile[nr[i][j]][die] = 1.; } } } } FOR(j,0,20) square(); printf("%.10lf\n", ile[start][ex]); }