Summary Files Commits Branches @commit @diff @stats
path: root / Year 2 / Design and analysis of algorithms / Practicum / Exam2 / 1-Office-FirstTry.cpp
blob: 00e5eabb850373dd2b12922c77a9df9c3a336590 (plain) (blame)
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <iostream>
#include <string>
#include <queue>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;

/*
 * .....# 6 + 7 + 8 + 9 + 10 = 21 + 19 = 40
 * .###.# 5
 * ...#.# 4 + 5 + 6 = 15
 * .##### 3
 * ..^..# 2 + 1 + 0 + 1 + 2 = 6
 * ######
 *
 *
3 3 1
.##
...
##.
1 1


10 10 10
+.####...#
####.#.##.
...#....##
.###......
###.....#.
..#.......
##.......#
..#.##.###
...###.##.
.#...#...#
1 1
1 7
2 10
3 1
6 1
8 1
9 10
10 8
5 2
1 3


 */

typedef pair<long long, long long> loc;

long long N, M, K;
loc dir[] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1}};

loc operator+(const loc& p1, const loc& p2) {
	return { p1.first + p2.first, p1.second + p2.second };
}


vector<vector<long long>> djikstra(loc s, vector<string>& matrix) {
	priority_queue<pair<long long, loc>, vector<pair<long long, loc>>, less<pair<long long, loc>>> q;
	vector<vector<bool>> visited(N, vector<bool>(M));
	vector<vector<long long>> dist(N, vector<long long>(M, -1));
	dist[s.first][s.second] = 0;
	q.push({ 0, s });
	while (!q.empty()) {
		loc c = q.top().second;
		q.pop();

		visited[c.first][c.second] = true;
		for (int i = 0; i < 4; i++) {
			loc ne = c + dir[i];
			if (0 > ne.first || ne.first >= N || 0 > ne.second || ne.second >= M || visited[ne.first][ne.second] || matrix[ne.first][ne.second] == '#') continue;

			if (dist[ne.first][ne.second] == -1 || dist[c.first][c.second] + 1 < dist[ne.first][ne.second]) {
				dist[ne.first][ne.second] = dist[c.first][c.second] + 1;
				q.push({ dist[ne.first][ne.second], ne});
			}
		}
	}
	return dist;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N >> M >> K;
	string s;
	vector<string> matrix;
	for (long long i = 0; i < N; i++) {
		cin >> s;
		matrix.push_back(s);
	}
	vector<pair<long, long>> food;
	for (long long i = 0; i < K; i++) {
		long long ri, ci;
		cin >> ri >> ci;
		food.push_back({ri-1, ci-1});
	}

	long long sum = 0;
	for (long long i = 0; i < N; i++) {
		for (long long j = 0; j < M; j++) {
			if (matrix[i][j] == '#') continue;

			vector<vector<long long>> dist = djikstra({i,j}, matrix);
			// cout << endl << i << " " << j << " is at" << endl;
			// for (long long i = 0; i < N; i++) {
			//	 for (long long j = 0; j < M; j++) {
			//		 cout << i << " " << j << " dist " << dist[i][j] << endl;
			//	 }
			// }
			long long mind = -1;
			for (auto f : food) {
				if (matrix[f.first][f.second] == '#') continue;
				if (mind == -1) {
					mind = dist[f.first][f.second];
					continue;
				}
				mind = min(mind, dist[f.first][f.second]);
			}
			// cout << "mind " << mind << endl;
			sum += mind;
		}
	}
	cout << sum << endl;
}