forked from mpfeifer1/Kattis
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathamoebas.cpp
111 lines (89 loc) · 2.17 KB
/
amoebas.cpp
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
#include <iostream>
#include <vector>
#include <string>
#include <stack>
using namespace std;
typedef long long ll;
struct check {
int i;
int j;
int pi;
int pj;
};
bool inrange(int i, int j, int r, int c) {
if(i < 0) {
return false;
}
if(j < 0) {
return false;
}
if(i >= r) {
return false;
}
if(j >= c) {
return false;
}
return true;
}
bool dfs(vector<vector<bool>>& v, vector<vector<char>>& graph, int i, int j, int row, int col) {
int starti, startj;
starti = i;
startj = j;
stack<check> todo;
todo.push({i,j,-5,-5});
check c = todo.top();
bool connected = false;
while(!todo.empty()) {
c = todo.top();
todo.pop();
for(int i = -1; i <= 1; i++) {
for(int j = -1; j <= 1; j++) {
int thisi = c.i + i;
int thisj = c.j + j;
if(thisi == starti && thisj == startj) {
connected = true;
}
if(!inrange(thisi, thisj, row, col)) {
continue;
}
if(i == 0 && j == 0) {
continue;
}
if(thisi == c.pi && thisj == c.pj) {
continue;
}
if(!v[thisi][thisj] && graph[thisi][thisj] == '#') {
todo.push({thisi, thisj, c.i, c.j});
v[thisi][thisj] = true;
}
}
}
}
return connected;
}
int main() {
int r, c;
cin >> r >> c;
vector<vector<char>> graph;
graph.resize(r);
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
char ch;
cin >> ch;
graph[i].push_back(ch);
}
}
vector<vector<bool>> visited;
visited.resize(r, vector<bool>(c, false));
int total = 0;
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
if(!visited[i][j]) {
if(graph[i][j] == '#' && dfs(visited, graph, i, j, r, c)) {
total++;
}
}
}
}
cout << total << endl;
}