#include using namespace std; #define FOR(i,l,r) for(int i = (int) (l);i < (int) (r);i++) template bool chmax(T& a,const T& b){ return a < b ? (a = b,true) : false; } template bool chmin(T& a,const T& b){ return b < a ? (a = b,true) : false; } typedef long long ll; int N,M,K; vector S; map< pair,pair > mp; const int dx [] = {0,1,0,-1}; const int dy [] = {-1,0,1,0}; const double EPS = 1e-8; const double INF = 1e18; bool can_goal [100] [100]; void dfs(int y,int x) { can_goal [y] [x] = true; if(mp.count(make_pair(y,x))){ pair& p = mp [make_pair(y,x)]; y = p.first; x = p.second; } FOR(k,0,4){ int ny = y + dy [k],nx = x + dx [k]; if((ny >= 0 && ny < N && nx >= 0 && nx < M) == false) continue; if(S [ny] [nx] == '#' || can_goal [ny] [nx]) continue; dfs(ny,nx); } } vector gauss_jordan(vector< vector > A) { int n = A.size(); for(int i = 0;i < n;i++){ int pivot = i; for(int j = i;j < n;j++){ if(abs(A [j] [i]) > abs(A [pivot] [i])) pivot = j; } swap(A [i],A [pivot]); if(abs(A [i] [i]) < EPS) return vector(); for(int j = i + 1;j <= n;j++) A [i] [j] /= A [i] [i]; for(int j = 0;j < n;j++){ if(i != j){ for(int k = i + 1;k <= n;k++) A [j] [k] -= A [j] [i] * A [i] [k]; } } } vector x(n); for(int i = 0;i < n;i++) x [i] = A [i] [n]; return x; } int main() { cin >> N >> M >> K; S.assign(N,""); FOR(i,0,N){ cin >> S [i]; } FOR(i,0,K){ int y1,x1,y2,x2; cin >> y1 >> x1 >> y2 >> x2; y1--; x1--; y2--; x2--; mp [make_pair(y1,x1)] = make_pair(y2,x2); mp [make_pair(y2,x2)] = make_pair(y1,x1); } int sy,sx; FOR(i,0,N) FOR(j,0,M){ if(S [i] [j] == 'A'){ sy = i; sx = j; } if(S [i] [j] == '%' && can_goal [i] [j] == false){ dfs(i,j); } } vector< vector > A(N * M,vector(N * M + 1)); FOR(i,0,N) FOR(j,0,M){ if(S [i] [j] == '*' || can_goal [i] [j] == false){ A [i * M + j] [i * M + j] = 1.0; A [i * M + j] [N * M] = 0.0; continue; } else if(S [i] [j] == '%'){ A [i * M + j] [i * M + j] = 1.0; A [i * M + j] [N * M] = 1.0; continue; } int y = i,x = j; if(mp.count(make_pair(y,x))){ pair& p = mp [make_pair(y,x)]; y = p.first; x = p.second; } int move = 0; FOR(k,0,4){ int ny = y + dy [k],nx = x + dx [k]; if((ny >= 0 && ny < N && nx >= 0 && nx < M) == false) continue; if(S [ny] [nx] == '#') continue; A [i * M + j] [ny * M + nx] = -1.0; move++; } A [i * M + j] [i * M + j] = move == 0 ? 1 : move; A [i * M + j] [N * M] = 0.0; } vector ans = gauss_jordan(A); printf("%.10f\n",ans [sy * M + sx]); return 0; }