#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]);
}