#include using namespace std; typedef pair ii; char maze[25][25]; int n, m, k; int dr[4] = {-1, 0, 1, 0}; // up, right, down, left int dc[4] = {0, 1, 0, -1}; bool bound(int x, int y) { if (x < 1 || y < 1 || x > n || y > m) return false; return true; } int main() { scanf("%d %d %d", &n, &m, &k); for (int i = 0; i < n; i++) { scanf("%s", maze[i]); } int a, b, c, d; ii tunnel[25][25]; for (int i = 0; i < k; i++) { scanf("%d %d %d %d", &a, &b, &c, &d); maze[a][b] = maze[c][d] = 't'; tunnel[a][b] = make_pair(c, d); tunnel[c][d] = make_pair(a, b); } int dis[25][25]; for (int i = 0; i <= n; i++) for (int j = 0; j <= m; j++) dis[i][j] = -1; queue q; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) if (maze[i][j] == 'A') { q.push(make_pair(i, j)); dis[i][j] = 0; break; } double ans = 1.0; while (!q.empty()) { ii u = q.front(); int ux = u.first, uy = u.second; q.pop(); for (int i = 0; i < 4; i++) { ii v = make_pair(u.first + dr[i], u.second + dc[i]); int x = v.first, y = v.second; if (dis[x][y] == -1) { if (maze[x][y] == 't') { int tx = tunnel[x][y].first, ty = tunnel[x][y].second; dis[tx][ty] = dis[x][y] = dis[ux][uy] + 1; q.push(make_pair(tx, ty)); } else if (maze[x][y] == '%') { dis[x][y] = dis[ux][uy] + 1; for (int i = 0; i < dis[x][y]; i++) { ans *= 0.25; } break; } else if (maze[x][y] == 'O') { dis[x][y] = dis[ux][uy] + 1; q.push(make_pair(x, y)); } else if (maze[x][y] = '*') dis[x][y] = dis[ux][uy] + 1; } } } printf("%lf\n", ans); return 0; }