#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; const int MAXN= (int)1e5+10; const ll MOD = (ll)1e9+7; char mp[22][22]; double dp[22][22]; double s[22][22]; int mark[22][22]; int mx[]={1,-1,0,0}; int my[]={0,0,1,-1}; int n,m,k; struct node{ int x,y; node(){}node(int _x,int _y){ x=_x;y=_y; } }; bool isok(int x,int y){ return x>=1&&x<=n&&y>=1&&y<=m; } node mm[22][22]; int vis[22][22]; int idx(int x,int y){ return (x-1)*n+y; } double dfs(int x,int y){ if(mp[x][y]=='%')return 1.0; if(mark[x][y])return dp[x][y]; int fm=0; double tol=0.0; for(int i=0;i<4;i++){ int nx,ny; nx=x+mx[i];ny=y+my[i]; if(isok(nx,ny)) { fm++; if(mp[nx][ny]!='*'&&mp[nx][ny]!='#'){ if(vis[nx][ny]){ vis[nx][ny]=vis[mm[nx][ny].x][mm[nx][ny].y]=0; nx=mm[nx][ny].x,ny=mm[nx][ny].y; tol+=dfs(nx,ny); vis[nx][ny]=vis[mm[nx][ny].x][mm[nx][ny].y]=1; } else { tol+=dfs(nx,ny); } } } } dp[x][y]=tol/(1.0*fm); mark[x][y]=1; return dp[x][y]; } int main() { memset(mark,0,sizeof(mark)); int sx,sy; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++){ scanf("%s",mp[i]+1); for(int j=1;j<=m;j++){ if(mp[i][j]=='A'){ sx=i;sy=j; } } } for(int i=1;i<=k;i++){ int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); mm[x1][y1]=node(x2,y2); mm[x2][y2]=node(x1,y1); vis[x1][y1]=vis[x2][y2]=1; } printf("%.9f\n",dfs(sx,sy)); return 0; }