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
#include <bits/stdc++.h>

using namespace std;
queue<pair<pair<int, int>, int>> q;
long long a, b, c,od[2002][2002],odl[2020][2020] ;
string d[2002];
void dfs(int pozx, int pozy, int odli)
{
    q.push(make_pair(make_pair(0, 0), 0));
    while (q.size())
    {
        pozx = q.front().first.first;
        pozy = q.front().first.second;
        odli = q.front().second;
        q.pop();
        if (pozx != 0 && od[pozx - 1][pozy] == 0 && d[pozx - 1][pozy] == '.')
        {
            od[pozx - 1][pozy] = 1;
            odl[pozx - 1][pozy] = odli + 1;
            q.push(make_pair(make_pair(pozx - 1, pozy), odli + 1));
        }
        if (pozy != 0 && od[pozx][pozy - 1] == 0 && d[pozx][pozy - 1] == '.')
        {
            od[pozx][pozy - 1] = 1;
            odl[pozx][pozy - 1] = odli + 1;
            q.push(make_pair(make_pair(pozx, pozy - 1), odli + 1));
        }
        if (pozx < a - 1 && od[pozx + 1][pozy] == 0 && d[pozx + 1][pozy] == '.')
        {
            od[pozx + 1][pozy] = 1;
            odl[pozx + 1][pozy] = odli + 1;
            q.push(make_pair(make_pair(pozx + 1, pozy), odli + 1));
        }

        if (pozy < b - 1 && od[pozx][pozy + 1] == 0 && d[pozx][pozy + 1] == '.')
        {
            od[pozx][pozy + 1] = 1;
            odl[pozx][pozy + 1] = odli + 1;
            q.push(make_pair(make_pair(pozx, pozy + 1), odli + 1));
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> a >> b >> c;
    for (int i = 0; i < a; i++)
    {
        cin >> d[i];
    }
    dfs(0, 0, 0);
    long long int firstmoves = (odl[a - 1][b - 1] - (a - 1) - (b - 1)) / 2 + a - 1 + b - 1;
    long long int secondmoves = (odl[a - 1][b - 1] - (a - 1) - (b - 1)) / 2;
    long long int wyn = 1e18;
    long long int licz = 0;
    for (int i = 0; i < c; i++)
    {
        cin >> a >> b;
        if (firstmoves * a + secondmoves * b < wyn)
        {
            wyn = firstmoves * a + secondmoves * b;
            licz = 1;
        }
        else if (firstmoves * a + secondmoves * b == wyn)
        {
            licz++;
        }
    }
    cout << wyn << " " << licz << "\n";
}