#include #include #include #include #include #include using namespace std; double visit(int n, int m, int k, int i, int j, vector> &maze, map, pair> &tunnels); double f(int n, int m, int k, int i, int j, vector> &maze, map, pair> &tunnels) { if (maze[i][j] == '*') return 0.; if (maze[i][j] == '%') return 1.; int nn = 0; if (i > 0) if (maze[i-1][j] != '#') ++nn; if (j > 0) if (maze[i][j-1] != '#') ++nn; if (i < n-1) if (maze[i+1][j] != '#') ++nn; if (j < m-1) if (maze[i][j+1] != '#') ++nn; if (nn == 0) return 0.; double t = 0.; t += visit(n, m, k, i-1, j, maze, tunnels); t += visit(n, m, k, i+1, j, maze, tunnels); t += visit(n, m, k, i, j-1, maze, tunnels); t += visit(n, m, k, i, j+1, maze, tunnels); return t/(double)nn; } double visit(int n, int m, int k, int i, int j, vector> &maze, map, pair> &tunnels) { if (i < 0 || i >= n) return 0.; if (j < 0 || j >= m) return 0.; if (maze[i][j] == '#') return 0.; auto p = make_pair(i, j); auto it = tunnels.find(p); if (it == tunnels.end()) return f(n, m, k, i, j, maze, tunnels); else { return f(n, m, k, it->second.first, it->second.second, maze, tunnels); } } int main() { int n, m, k; while(cin >> n >> m >> k) { vector> maze(n, vector(m)); map, pair> tunnels; int i0, j0; for(int i = 0; i < n; ++i) { for(int j = 0; j < m; ++j) { char c; cin >> c; maze[i][j] = c; if (c == 'A') { i0 = i; j0 = j; } } } for(int i = 0; i < k; ++i) { int i1, j1, i2, j2; cin >> i1 >> j1 >> i2 >> j2; tunnels[make_pair(i1-1, j1-1)] = make_pair(i2-1, j2-1); tunnels[make_pair(i2-1, j2-1)] = make_pair(i1-1, j1-1); } cout << f(n, m, k, i0, j0, maze, tunnels) << endl; } return 0; }