#include #define pb push_back #define mp make_pair #define size(n) ( int( n.size() ) ) #define sqr(n) ( (n) * (n) ) #define fi first #define se second using namespace std; typedef long long ll; typedef long double ld; const int N = 25, MX = 200, mxCnt = 500; int cnt = 0, num[N][N], f[N][N], n, m; ld p[N][N][MX]; char a[N][N]; pair < int, int > tun[N][N], nxt[N][N], ver[mxCnt]; int vis[mxCnt]; int cntEdges = 0; vector < int > st; vector < pair < int, int > > gr[N][N]; int valid( int cx, int cy ){ return ( cx >= 1 ) && ( cx <= n ) && ( cy >= 1 ) && ( cy <= m ); } void add( int cx, int cy, int tx, int ty ){ if ( ( !valid(tx,ty) ) || ( !num[tx][ty] ) || ( a[cx][cy] == '*' ) ){ return; } if ( tun[tx][ty] == mp( -1, -1 ) ){ gr[cx][cy].pb( mp( tx, ty ) ); } else{ gr[cx][cy].pb( mp( tun[tx][ty].fi, tun[tx][ty].se ) ); } } int main(){ //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); int k, sx, sy; scanf("%d %d %d\n",&n,&m,&k); for ( int i = 1; i <= n; i++ ){ for ( int j = 1; j <= m; j++ ){ tun[i][j] = mp( -1, -1 ); f[i][j] = -1; scanf("%c",&a[i][j]); if ( a[i][j] == 'A' ){ sx = i; sy = j; } if ( a[i][j] != '#' ){ ++cnt; num[i][j] = cnt; ver[cnt] = mp( i, j ); } } scanf("\n"); } for ( int i = 1; i <= k; i++ ){ int cx, cy, tx, ty; scanf("%d %d %d %d",&cx,&cy,&tx,&ty); tun[cx][cy] = mp( tx, ty ); tun[tx][ty] = mp( cx, cy ); } for ( int i = 1; i <= n; i++ ){ for ( int j = 1; j <= m; j++ ){ if ( num[i][j] ){ add( i, j, i - 1, j ); add( i, j, i + 1, j ); add( i, j, i, j + 1 ); add( i, j, i, j - 1 ); } } } for ( int i = 1; i <= cnt; i++ ){ if ( !size(gr[ ver[i].fi ][ ver[i].se ]) ){ continue; } if ( size(gr[ ver[i].fi ][ ver[i].se ]) == 1 ){ st.clear(); int cx = i, nx; while( ( size( gr[ ver[cx].fi ][ ver[cx].se ] ) == 1 ) && ( !vis[cx] ) ){ if ( a[ ver[cx].fi ][ ver[cx].se ] == '%' ){ break; } vis[cx] = 1; st.pb(cx); nx = num[ gr[ ver[cx].fi ][ ver[cx].se ][0].fi ][ gr[ ver[cx].fi ][ ver[cx].se ][0].se ]; cx = nx; } for ( int j = 0; j < size(st); j++ ){ gr[ ver[ st[j] ].fi ][ ver[ st[j] ].se ].clear(); vis[ st[j] ] = 0; gr[ ver[ st[j] ].fi ][ ver[ st[j] ].se ].pb( ver[nx] ); } } } for ( int i = 1; i <= n; i++ ){ for ( int j = 1; j <= m; j++ ){ if ( a[i][j] == '%' ){ p[i][j][0] = 1.0; for ( int len = 1; len <= 40; len++ ){ p[i][j][len] = 0.0; } } else{ p[i][j][0] = 0.0; } } } ld qq = 0.0; for ( int len = 1; len <= 150; len++ ){ for ( int i = 1; i <= n; i++ ){ for ( int j = 1; j <= m; j++ ){ if ( a[i][j] == '%' ){ continue; } if ( !size(gr[i][j]) ){ continue; } p[i][j][len] = qq; for ( int t = 0; t < size( gr[i][j] ); t++ ){ p[i][j][len] += p[ gr[i][j][t].fi ][ gr[i][j][t].se ][len-1]; } p[i][j][len] /= ( size( gr[i][j] ) + qq ); } } } ld ans = 0; for ( int len = 1; len <= 150; len++ ){ ans += p[sx][sy][len]; } cout << fixed << setprecision(15) << ans << endl; return 0; }