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
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <bits/stdc++.h>
using namespace std;
//{
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define FORD(i, a, b) for(int i = (a); i >= (b); --i)
#define VAR(v, i) __typeof(i) v=(i)
#define all(v) (v).begin(),(v).end()
#define FORE(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i)


#define PII pair<int,int>
#define st first
#define nd second
#define pb push_back
#define lint long long int
#define VI vector<int>

#define sim template < class c
#define ris return * this
#define dor > debug & operator <<
#define eni(x) sim > typename \
  enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
~debug() { cerr << endl; }
eni(!=) cerr << boolalpha << i; ris; }
eni(==) ris << range(begin(i), end(i)); }
sim, class b dor(pair < b, c > d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
	*this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
};
//{
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "

#define make( x) int (x); scanf("%d",&(x));
#define make2( x, y) int (x), (y); scanf("%d%d",&(x),&(y));
#define make3(x, y, z) int (x), (y), (z); scanf("%d%d%d",&(x),&(y),&(z));
#define make4(x, y, z, t) int (x), (y), (z), (t); scanf("%d%d%d%d",&(x),&(y),&(z),&(t));
#define makev(v,n) VI (v); FOR(i,0,(n)) { make(a); (v).pb(a);} 
#define IOS ios_base::sync_with_stdio(0)
#define HEAP priority_queue

#define read( x) scanf("%d",&(x));
#define read2( x, y) scanf("%d%d",&(x),&(y));
#define read3(x, y, z) scanf("%d%d%d",&(x),&(y),&(z));
#define read4(x, y, z, t) scanf("%d%d%d%d",&(x),&(y),&(z),&(t));
#define readv(v,n) FOR(i,0,(n)) { make(a); (v).pb(a);}
#define jeb() fflush(stdout);
//}

int n,m,k;
char s[2005][2005];
vector<PII> w;
int dp[2005][2005];

int dx[] = {-1,0,0,1};
int dy[] = {0,-1,1,0};

bool inside(int a, int b) {
	return a>=0 && a<n && b>=0 && b<m;
}

int main() {
	read3(n, m, k);
	FOR(i,0,n) {
		scanf("%s", s[i]);
	}
	FOR(i,0,k) {
		make2(a, b);
		w.pb({a,b});
	}
	FOR(i,0,n) FOR(j,0,m) dp[i][j] = 1e9;
	dp[0][0] = 0;
	int it = 0;
	vector<pair<PII,int> > v; v.pb({{0,0},0});
	while (it < v.size()) {
		PII kto = v[it].st;
		int co = v[it].nd;
		it++;
		if (dp[kto.st][kto.nd] !=co) continue;
		FOR(j,0,4) {
			int nx = kto.st + dx[j];
			int ny = kto.nd + dy[j];
			if (!inside(nx, ny)) continue;
			if (s[nx][ny] == 'X') continue;
			if (dp[nx][ny] > dp[kto.st][kto.nd]+1) {
				dp[nx][ny] = dp[kto.st][kto.nd] + 1;
				v.pb({{nx,ny}, dp[kto.st][kto.nd] + 1});
			}
		}
	}
	int ans = dp[n-1][m-1];
	int zle = (ans - (n-1)-(m-1))/2;
	int dobre = (n-1)+(m-1)+zle;
	lint best = 1e18;
	FOR(i,0,k) {
		best = min(best, dobre*1LL*w[i].st + zle*1LL*w[i].nd);
	}
	ans = 0;
	FOR(i,0,k) {
		if (best == dobre*1LL*w[i].st + zle*1LL*w[i].nd) {
			ans++;
		}
	}
	printf("%lld %d\n", best, ans);
}