#include using namespace std; int n , m , k ; char c[21][21] ; char perm[21][21] ; vector< pair > path[21][21] ; set< pair > tunnel ; int startx , starty , endx , endy ; bool inside( int x , int y ){ return x>=1 and y>=1 and x<=n and y<=m ; } bool not_tunnel( int x , int y ){ return tunnel.find( make_pair(x,y) ) == tunnel.end() ; } pair< double , double > find_ans( int x , int y , set< pair< int , int > >nonset , pair pp) ; int main() { cin >> n >> m >> k ; for( int i=1 ; i<=n ; i++ ){ for( int j=1 ; j<=m ; j++){ cin >> c[i][j] ; perm[i][j]=c[i][j] ; if( c[i][j]=='*' ){ c[i][j]='O' ; } if( c[i][j]=='A' ){ startx = i ; starty = j ; c[i][j]='O' ; } else if( c[i][j]=='%' ){ endx = i ; endy = j ; c[i][j]='O' ; } } } while( k-- ){ int x1 , y1 , p1 , q1 ; cin >> x1 >> y1 >> p1 >> q1 ; tunnel.insert( make_pair(x1,y1) ) ; tunnel.insert( make_pair(p1 , q1) ) ; path[x1][y1].push_back( make_pair(p1,q1) ) ; path[p1][q1].push_back( make_pair(x1,y1) ) ; } for( int i=1 ; i<=n ; i++ ){ for( int j=1 ; j<=m ; j++){ if( c[i][j] == 'O' and not_tunnel(i,j) ){ //cout<<" for " < > nonset ; pair< double , double > p = find_ans(startx , starty , nonset , make_pair(-1 , -1 ) ) ; cout<< (p.first/p.second) < find_ans( int x , int y , set< pair< int , int > >nonset , pair pp){ set< pair< int , int > > temp_set ; temp_set.insert( pp ) ; set< pair< int , int > > :: iterator it = nonset.begin() ; while( it!= nonset.end() ){ temp_set.insert( *it ) ; it++ ; } // cout<<" came for "< p = path[x][y][i] ; if( temp_set.find(p) == temp_set.end() ){ cnt++ ; } } double factor = 1.0/(cnt*1.0) ; pair< double , double > ans = make_pair( 0 , 1 ) ; for( int i=0 ; i p = path[x][y][i] ; if(temp_set.find(p) == temp_set.end() ){ ans.first += ( factor* (find_ans(p.first,p.second,temp_set , p) ).first ) ; } } return ans ; }