//spnauT
#include <bits/stdc++.h>
#define FOR(i,a,b) for(int _=b,i=a;i<_;++i)
#define ROF(i,b,a) for(int _=a,i=b;i>_;--i)
#define REP(n) for(int _=(n);_--;)
#define _1 first
#define _2 second
#define PB push_back
#define SZ(x) int((x).size())
#define ALL(x) begin(x),end(x)
#define MSET(m,v) memset(m,v,sizeof(m))
#define MAX_PQ(T) priority_queue<T>
#define MIN_PQ(T) priority_queue<T,vector<T>,greater<T>>
#define IO {ios_base::sync_with_stdio(0);cin.tie(0);}
#define nl '\n'
#define cint1(a) int a;cin>>a
#define cint2(a,b) int a,b;cin>>a>>b
#define cint3(a,b,c) int a,b,c;cin>>a>>b>>c
using namespace std;using LL=int64_t;using PII=pair<int,int>;
using VI=vector<int>;using VL=vector<LL>;using VP=vector<PII>;
template<class A,class B>bool mina(A&x,B&&y){return y<x?(x=forward<B>(y),1):0;}
template<class A,class B>bool maxa(A&x,B&&y){return x<y?(x=forward<B>(y),1):0;}

const double low {1e-100};

template <class T, int N>
class MatrixN {
public:
	vector<T> A;
	MatrixN() : MatrixN(0) {}
	MatrixN(const T &def) {A.resize(N*N, def);}
	MatrixN(const vector<T> &v) {A=v; if(int(A.size()) != N*N) A.resize(N*N);}
	MatrixN(const vector <vector<T>> &B) {int k=0; A.resize(N*N); FOR(i,0,N) FOR(j,0,N) A[k++] = B[i][j];}
	MatrixN operator + (const MatrixN &B) const {return (MatrixN(*this) += B);}
	MatrixN operator - (const MatrixN &B) const {return (MatrixN(*this) -= B);}
	MatrixN operator * (const MatrixN &B) const {return (MatrixN(*this) *= B);}
	MatrixN operator * (const T a) const {return (MatrixN(*this) *= a);}
	MatrixN &operator += (MatrixN B) {FOR(i,0,N*N) this->A[i] += B.A[i]; return *this;}
	MatrixN &operator -= (MatrixN B) {FOR(i,0,N*N) this->A[i] -= B.A[i]; return *this;}
	MatrixN &operator *= (MatrixN B)
	{
		MatrixN C(this->A); this->A=vector<T>(N*N,T(0)); FOR(i,0,N) FOR(j,0,N) {T sum=0; FOR(k,0,N) sum += C[i][k] * B[k][j]; (*this)[i][j]=sum;}
		for(T& a: A) if(a < low) a = 0;
		return *this;
	}
	MatrixN &operator *= (const T a) {FOR(i,0,N*N) this->A[i] *= a; return *this;}
	T* operator[] (const int row) {return (T*) &A[row*N];}
	MatrixN power(LL k) {if(k <= 0) return identity(); if(k == 1) return *this; MatrixN P = identity(), B = *this; while(k > 0) {if(k&1) P*=B; B*=B; k>>=1;} return P;}
	MatrixN powerMod(LL k, T m) {MatrixN P = identity(); if(k == 1) P = *this; else if(k >= 2) {MatrixN B = *this; while(k > 0) {if(k&1) P*=B; B*=B; FOR(i,0,N*N) {P.A[i]%=m; B.A[i]%=m;} k>>=1;}} FOR(i,0,N*N) P.A[i]%=m; return P;}
	static MatrixN identity() {return diagonal(T(1),T(0));}
	static MatrixN diagonal(T diag, T rest) {MatrixN B(rest); FOR(i,0,N) B[i][i] = diag; return B;}
	void print_format(const char *f) {int k=0; FOR(i,0,N) ROF(j,N,0) {printf(f, A[k++]); putchar((j==1)?'\n':' ');} putchar('\n');}
	friend ostream& operator << (ostream &out, MatrixN B) {int k=0; FOR(i,0,N) FOR(j,0,N) out<<(j?' ':'\n')<<B.A[k++]; return out << endl;}
};

using Mat = MatrixN<double,400>;

const int dr[4] = {0, 1, 0, -1};
const int dc[4] = {1, 0, -1, 0};
const int MAX_N {24};

char B[MAX_N][MAX_N];
PII go[MAX_N][MAX_N];

int main()
{
	IO;
	cint3(R,C,K);
	FOR(i,0,R) cin >> B[i];
	REP(K)
	{
		cint2(r0,c0); --r0; --c0;
		cint2(r1,c1); --r1; --c1;
		B[r0][c0] = 't';
		B[r1][c1] = 't';
		go[r1][c1] = {r0,c0};
		go[r0][c0] = {r1,c1};
	}

	int R0 {0};
	int C0 {0};
	FOR(i,0,R) FOR(j,0,C) if(B[i][j] == 'A')
	{
		B[i][j] = 'O';
		R0 = i;
		C0 = j;
	}

	auto calc_id = [&](int r, int c) {return r * C + c;};
	Mat A(0);
	FOR(i,0,R) FOR(j,0,C)
	{
		int id0 {calc_id(i,j)};
		if(B[i][j] == '%') A[id0][id0] = 1;
		else if(B[i][j] == 'O' || B[i][j] == 't')
		{
			VI X;
			FOR(d,0,4)
			{
				int r {i + dr[d]};
				int c {j + dc[d]};
				if(r >= 0 and r < R and c >= 0 and c < C and B[r][c] != '#')
				{
					if(B[r][c] == 't') tie(r,c) = go[r][c];
					X.PB(calc_id(r,c));
				}
			}

			if(SZ(X) > 0)
			{
				double p {1.0 / SZ(X)};
				for(int x: X) A[id0][x] = p;
			}
		}
	}

	auto print = [&](Mat& A)
	{
		return;
		FOR(i,0,R*C)
		{
			FOR(j,0,R*C)
			{
				double p {A[i][j]};
				if(p < 1e-6) printf("---- ");
				else printf("%.2f ", p);
			}
			printf("\n");
		}
	};
	print(A);
	// putchar(nl);
	A = A.power(1<<20);
	print(A);

	double sol {0};
	int id0 {calc_id(R0,C0)};
	FOR(i,0,R) FOR(j,0,C) if(B[i][j] == '%') sol += A[id0][calc_id(i,j)];
	printf("%.6f\n", sol);

	return 0;
}