1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <vector>
#include <cstdlib>
#include <queue>
#include <algorithm>
using namespace std;

#define REP(i,n) for(int i=0; i<(n); i++)
#define FOR(i,a,b) for(int i=(a); i<=(b); i++)


const int INF = 2000000000;
const int MAXN = 2010;

int n, m, k;
char map[MAXN][MAXN]={0};
int d[MAXN][MAXN];
pair<int, int> pre[MAXN][MAXN];

int adjX[4] = {1, 0, -1, 0};
int adjY[4] = {0, -1, 0, 1};

void solve() {
    queue<pair<int, int> > q;
    q.push(make_pair(0,0)); 
    d[0][0] = 0;
    while(!q.empty()) {
        pair<int,int> v = q.front();
        q.pop();    
        int row = v.first;
        int col = v.second;
        REP(i,4) { 
            int r = row + adjY[i];
            int c = col + adjX[i];
            if(r<0 || c<0 || r >= n || c >= m) continue;
            if(map[r][c] == 1) continue;
            if(d[row][col] + 1 >= d[r][c]) continue;
            d[r][c] = d[row][col] + 1;
            pre[r][c] = make_pair(row, col);
            q.push(make_pair(r,c));
        }
    }
}
        
int main() {
    cin >> n >> m >> k;
    string row;
    REP(i,n) {
        cin >> row;
        REP(j,m) {
            map[i][j] = row[j]=='.' ? 0 : 1;
            d[i][j] = INF;
        }
    }   

    solve();

    long long a=0, b=0;
    int r = n-1, c = m-1;
    while(r+c > 0) {
        pair<int, int> v = pre[r][c];
        int rp = v.first;
        int cp = v.second;

        if(rp < r || cp < c) a++; else b++; 

        r = rp;
        c = cp;
    }
    

    long long best = 2LL * MAXN * MAXN * 1000000100;  
    vector<long long> times(k, 0);
    int ta, tb;
    REP(i,k) {
        cin >> ta >> tb;
        times[i] = a*ta + b*tb; 
        best = min(best, times[i]);
    } 
    int numBest = 0;
    REP(i,k) {
        if(times[i] == best) numBest++;
    }
    cout << best << " " << numBest << endl;
    return 0;
}