#include <bits/stdc++.h>
using namespace std;
struct State {
State *prv;
short cost, type;
State(short _cost = 1000) : prv(nullptr), cost(_cost), type(-1) {}
State(State *_prv, short _type) : prv(_prv), type(_type), cost(_prv->cost) {
if (type < 4) cost++;
else if (type < 10) cost += 2;
}
State(State *_prv1, short _type1, State *_prv2, short _type2) {
if (_prv1->cost < _prv2->cost) prv = _prv1, type = _type1;
else prv = _prv2, type = _type2;
cost = prv->cost;
if (type < 4) cost++;
else if (type < 10) cost += 2;
}
};
string grid[25];
State *dp[12][40][1 << 13];
int main() {
cin.tie(0)->sync_with_stdio(0);
int r, c;
cin >> r >> c;
getline(cin, grid[0]); // Buffer stuff >:(
for (int i = 0; i < r; i++) getline(cin, grid[i]);
int n = r >> 1, m = c >> 1;
for (int i = 0; i < n; i++)
for (int j = 0; j <= m; j++)
for (int mask = 0; mask < (1 << n + 1); mask++)
dp[i][j][mask] = new State();
dp[n - 1][0][0] = new State(0);
for (int j = 1; j <= m; j++) {
for (int i = 0; i < n; i++) {
for (int mask = 0; mask < (1 << n + 1); mask++) {
int r = mask & (1 << i), d = mask & (1 << i + 1);
// You can't connect over a blocked corridor
if (r && grid[2 * i + 1][2 * j] == '|') continue;
if (d && grid[2 * i + 2][2 * j - 1] == '-') continue;
// An 'X' can't have more than 1 paths going out from it
if (r && d && grid[2 * i + 1][2 * j - 1] == 'X') continue;
// Casework for the DP
if (!i) {
int prv_base = (mask >> 2) << 1;
if (grid[2 * i + 1][2 * j - 1] == 'X') {
if (r || d) {
if (r) dp[i][j][mask] = new State(dp[n - 1][j - 1][prv_base], 1);
if (d) dp[i][j][mask] = new State(dp[n - 1][j - 1][prv_base], 2);
} else dp[i][j][mask] = new State(dp[n - 1][j - 1][prv_base + 1], 3);
} else {
if (r && d) dp[i][j][mask] = new State(dp[n - 1][j - 1][prv_base], 7);
else if (r || d) {
if (r) dp[i][j][mask] = new State(dp[n - 1][j - 1][prv_base + 1], 8);
if (d) dp[i][j][mask] = new State(dp[n - 1][j - 1][prv_base + 1], 9);
} else dp[i][j][mask] = new State(dp[n - 1][j - 1][prv_base], 10);
}
} else {
int prv_base = mask & (((1 << n + 1) - 1) ^ (1 << i) + (1 << i + 1));
if (grid[2 * i + 1][2 * j - 1] == 'X') {
if (r || d) {
if (r) dp[i][j][mask] = new State(dp[i - 1][j][prv_base], 1);
if (d) dp[i][j][mask] = new State(dp[i - 1][j][prv_base], 2);
} else dp[i][j][mask] = new State(
dp[i - 1][j][prv_base + (1 << i)], 0,
dp[i - 1][j][prv_base + (1 << i + 1)], 3);
} else {
if (r && d) dp[i][j][mask] = new State(dp[i - 1][j][prv_base], 7);
else if (r || d) {
if (r) dp[i][j][mask] = new State(
dp[i - 1][j][prv_base + (1 << i)], 4,
dp[i - 1][j][prv_base + (1 << i + 1)], 8);
if (d) dp[i][j][mask] = new State(
dp[i - 1][j][prv_base + (1 << i)], 5,
dp[i - 1][j][prv_base + (1 << i + 1)], 9);
} else dp[i][j][mask] = new State(
dp[i - 1][j][prv_base + (1 << i) + (1 << i + 1)], 6,
dp[i - 1][j][prv_base], 10);
}
}
}
}
}
cout << dp[n - 1][m][0]->cost << '\n';
State *curr = dp[n - 1][m][0];
for (int j = m - 1; ~j; j--) for (int i = n - 1; ~i; i--) {
if (curr->type == 0) grid[2 * i][2 * j + 1] = '.';
else if (curr->type == 1) grid[2 * i + 1][2 * j + 2] = '.';
else if (curr->type == 2) grid[2 * i + 2][2 * j + 1] = '.';
else if (curr->type == 3) grid[2 * i + 1][2 * j] = '.';
else if (curr->type == 4) grid[2 * i][2 * j + 1] = grid[2 * i + 1][2 * j + 1] = grid[2 * i + 1][2 * j + 2] = '.';
else if (curr->type == 5) grid[2 * i][2 * j + 1] = grid[2 * i + 1][2 * j + 1] = grid[2 * i + 2][2 * j + 1] = '.';
else if (curr->type == 6) grid[2 * i][2 * j + 1] = grid[2 * i + 1][2 * j + 1] = grid[2 * i + 1][2 * j] = '.';
else if (curr->type == 7) grid[2 * i + 1][2 * j + 2] = grid[2 * i + 1][2 * j + 1] = grid[2 * i + 2][2 * j + 1] = '.';
else if (curr->type == 8) grid[2 * i + 1][2 * j + 2] = grid[2 * i + 1][2 * j + 1] = grid[2 * i + 1][2 * j] = '.';
else if (curr->type == 9) grid[2 * i + 2][2 * j + 1] = grid[2 * i + 1][2 * j + 1] = grid[2 * i + 1][2 * j] = '.';
curr = curr->prv;
}
for (int i = 0; i < r; i++) cout << grid[i] << '\n';
return 0;
}
Compilation message
connect.cpp: In constructor 'State::State(State*, short int)':
connect.cpp:6:17: warning: 'State::type' will be initialized after [-Wreorder]
6 | short cost, type;
| ^~~~
connect.cpp:6:11: warning: 'short int State::cost' [-Wreorder]
6 | short cost, type;
| ^~~~
connect.cpp:9:5: warning: when initialized here [-Wreorder]
9 | State(State *_prv, short _type) : prv(_prv), type(_type), cost(_prv->cost) {
| ^~~~~
connect.cpp: In function 'int main()':
connect.cpp:35:47: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
35 | for (int mask = 0; mask < (1 << n + 1); mask++)
| ~~^~~
connect.cpp:40:47: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
40 | for (int mask = 0; mask < (1 << n + 1); mask++) {
| ~~^~~
connect.cpp:41:61: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
41 | int r = mask & (1 << i), d = mask & (1 << i + 1);
| ~~^~~
connect.cpp:63:53: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
63 | int prv_base = mask & (((1 << n + 1) - 1) ^ (1 << i) + (1 << i + 1));
| ~~^~~
connect.cpp:63:84: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
63 | int prv_base = mask & (((1 << n + 1) - 1) ^ (1 << i) + (1 << i + 1));
| ~~^~~
connect.cpp:63:74: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
63 | int prv_base = mask & (((1 << n + 1) - 1) ^ (1 << i) + (1 << i + 1));
| ~~~~~~~~~^~~~~~~~~~~~~~
connect.cpp:70:65: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
70 | dp[i - 1][j][prv_base + (1 << i + 1)], 3);
| ~~^~~
connect.cpp:76:69: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
76 | dp[i - 1][j][prv_base + (1 << i + 1)], 8);
| ~~^~~
connect.cpp:79:69: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
79 | dp[i - 1][j][prv_base + (1 << i + 1)], 9);
| ~~^~~
connect.cpp:81:76: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
81 | dp[i - 1][j][prv_base + (1 << i) + (1 << i + 1)], 6,
| ~~^~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
620 KB |
Output is correct |
2 |
Correct |
1 ms |
748 KB |
Output is correct |
3 |
Correct |
2 ms |
1644 KB |
Output is correct |
4 |
Correct |
20 ms |
15468 KB |
Output is correct |
5 |
Runtime error |
90 ms |
65540 KB |
Execution killed with signal 9 |
6 |
Correct |
2 ms |
1900 KB |
Output is correct |
7 |
Correct |
3 ms |
2412 KB |
Output is correct |
8 |
Correct |
4 ms |
3692 KB |
Output is correct |
9 |
Correct |
10 ms |
8044 KB |
Output is correct |
10 |
Correct |
14 ms |
11372 KB |
Output is correct |
11 |
Correct |
21 ms |
13548 KB |
Output is correct |
12 |
Correct |
34 ms |
23276 KB |
Output is correct |
13 |
Correct |
42 ms |
32876 KB |
Output is correct |
14 |
Correct |
67 ms |
47852 KB |
Output is correct |
15 |
Runtime error |
85 ms |
65536 KB |
Execution killed with signal 9 |
16 |
Runtime error |
75 ms |
65540 KB |
Execution killed with signal 9 |
17 |
Runtime error |
79 ms |
65540 KB |
Execution killed with signal 9 |
18 |
Runtime error |
98 ms |
65540 KB |
Execution killed with signal 9 |
19 |
Runtime error |
92 ms |
65540 KB |
Execution killed with signal 9 |
20 |
Runtime error |
74 ms |
65536 KB |
Execution killed with signal 9 |