//spnauT #include #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 #define MIN_PQ(T) priority_queue,greater> #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; using VI=vector;using VL=vector;using VP=vector; templatebool mina(A&x,B&&y){return y(y),1):0;} templatebool maxa(A&x,B&&y){return x(y),1):0;} const double low {1e-100}; template class MatrixN { public: vector A; MatrixN() : MatrixN(0) {} MatrixN(const T &def) {A.resize(N*N, def);} MatrixN(const vector &v) {A=v; if(int(A.size()) != N*N) A.resize(N*N);} MatrixN(const vector > &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(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')<; 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; }