#include using namespace std; int visited[21][21] = {0}; double soln = 0.00; vector aa,bb,cc,dd; vector maze; void func ( int posi, int posj, double ans ) { int possible = 0; if ( ans < 0.000001 ) return; if ( maze[posi][posj] == '%' ) { //cout << " Adding " << ans; soln = soln + ans; return; } if ( maze[posi][posj] == '*' ) { return; } if ( posi + 1 < maze.size() && maze[posi+1][posj] != '#' ) { // cout << " i+1 "<< endl; possible++; } if ( posi - 1 >= 0 && maze[posi-1][posj] != '#' ) { // cout << " i-1 "<< endl; possible++; } if ( posj + 1 < maze[0].length() && maze[posi][posj+1] != '#' ) { // cout << " j+1 "<< endl; possible++; } if ( posj - 1 >= 0 && maze[posi][posj-1] != '#' ) { //cout << " j-1 "<< endl; possible++; } if ( possible == 0 ) return; // cout << " current = " << posi << " " << posj << " poss " << possible << endl; if ( posi + 1 < maze.size() && maze[posi+1][posj] != '#' ) { int npi = posi+1; int npj = posj; //cout << " Seeing " << npi << " " << npj << endl; for ( int i = 0; i < aa.size(); i++ ) { if ( npi == aa[i] && npj == bb[i] ) { npi = cc[i]; npj = dd[i]; break; } if ( npi == cc[i] && npj == dd[i] ) { npi = aa[i]; npj = bb[i]; break; } } // cout << " GOING " << npi << " " << npj << endl; func(npi, npj, ans/(double)possible); } if ( posi - 1 > 0 && maze[posi-1][posj] != '#' ) { int npi = posi-1; int npj = posj; // cout << " Seeing " << npi << " " << npj << endl; for ( int i = 0; i < aa.size(); i++ ) { if ( npi == aa[i] && npj == bb[i] ) { npi = cc[i]; npj = dd[i]; break; } if ( npi == cc[i] && npj == dd[i] ) { npi = aa[i]; npj = bb[i]; break; } } //cout << " GOING " << npi << " " << npj << endl; func(npi, npj, ans/(double)possible); } if ( posj + 1 < maze[0].length() && maze[posi][posj+1] != '#' ) { int npi = posi; int npj = posj+1; //cout << " Seeing " << npi << " " << npj << endl; for ( int i = 0; i < aa.size(); i++ ) { if ( npi == aa[i] && npj == bb[i] ) { npi = cc[i]; npj = dd[i]; break; } if ( npi == cc[i] && npj == dd[i] ) { npi = aa[i]; npj = bb[i]; break; } } // cout << " GOING " << npi << " " << npj << endl; func(npi, npj, ans/(double)possible); } if ( posj - 1 > 0 && maze[posi][posj-1] != '#' ) { int npi = posi; int npj = posj-1; //cout << " Seeing " << npi << " " << npj << endl; for ( int i = 0; i < aa.size(); i++ ) { if ( npi == aa[i] && npj == bb[i] ) { npi = cc[i]; npj = dd[i]; break; } if ( npi == cc[i] && npj == dd[i] ) { npi = aa[i]; npj = bb[i]; break; } } //cout << " GOING " << npi << " " << npj << endl; func(npi, npj, ans/(double)possible); } } int main() { int n; int m; int k; cin >> n >> m >> k; int posi, posj; for(int a0 = 0; a0 < n; a0++){ string row; cin >> row; maze.push_back(row); for ( int i = 0; i < row.length(); i++ ) { if ( row[i] == 'A') { posi = a0; posj = i; } } } for(int a0 = 0; a0 < k; a0++){ int i1; int j1; int i2; int j2; cin >> i1 >> j1 >> i2 >> j2; aa.push_back(i1-1); bb.push_back(j1-1); cc.push_back(i2-1); dd.push_back(j2-1); //cout << " tunnel = " << i1 << " " << j1 << " " << i2 << " " << j2 << endl; } func ( posi, posj, 1); cout << soln ; return 0; }