Submission #544763

#TimeUsernameProblemLanguageResultExecution timeMemory
544763rainboyConnect (CEOI06_connect)C11
100 / 100
36 ms36712 KiB
#include <stdio.h> #include <string.h> #define N 12 #define M 39 #define INF 0x3f3f3f3f int main() { static char s[32], aa[N * 2 + 1][M * 2 + 3]; static int dp[M + 1][N][1 << N][2], bb[M + 1][N][1 << N][2]; static char cc[M + 1][N][1 << N][2], dd[M + 1][N][1 << N][2]; int n, m, i, j, b, c; fgets(s, 32, stdin), sscanf(s, "%d%d", &n, &m), n /= 2, m /= 2; for (i = 0; i <= n * 2; i++) fgets(aa[i], m * 2 + 3, stdin); memset(dp, 0x3f, sizeof dp); dp[0][0][0][0] = 0; for (j = 0; j < m; j++) for (i = 0; i < n; i++) { int (*dp1)[2] = dp[j][i], (*dp2)[2], (*bb2)[2]; char (*cc2)[2], (*dd2)[2]; if (i == n - 1) dp2 = dp[j + 1][0], bb2 = bb[j + 1][0], cc2 = cc[j + 1][0], dd2 = dd[j + 1][0]; else dp2 = dp[j][i + 1], bb2 = bb[j][i + 1], cc2 = cc[j][i + 1], dd2 = dd[j][i + 1]; for (b = 0; b < 1 << n; b++) for (c = 0; c < 2; c++) { int x = dp1[b][c], b_, c_; if (x == INF) continue; if (c == 1) { b_ = b & ~(1 << i), c_ = 0; if (aa[i * 2 + 1][j * 2 + 1] == ' ') if (dp2[b_][c_] > x) dp2[b_][c_] = x, bb2[b_][c_] = b, cc2[b_][c_] = c, dd2[b_][c_] = 0; } else if (((b & 1 << i) == 0) == (aa[i * 2 + 1][j * 2 + 1] == ' ')) { b_ = b & ~(1 << i), c_ = 0; if (dp2[b_][c_] > x) dp2[b_][c_] = x, bb2[b_][c_] = b, cc2[b_][c_] = c, dd2[b_][c_] = 0; if ((b & 1 << i) == 0 && aa[i * 2 + 2][j * 2 + 1] == ' ' && aa[i * 2 + 1][j * 2 + 2] == ' ') { b_ = (b | 1 << i) ^ 1 << i + 1, c_ = b >> i + 1 & 1; if (dp2[b_][c_] > x + 2) dp2[b_][c_] = x + 2, bb2[b_][c_] = b, cc2[b_][c_] = c, dd2[b_][c_] = 3; } } else { if (aa[i * 2 + 2][j * 2 + 1] == ' ') { b_ = (b & ~(1 << i)) ^ 1 << i + 1, c_ = b >> i + 1 & 1; if (dp2[b_][c_] > x + 1) dp2[b_][c_] = x + 1, bb2[b_][c_] = b, cc2[b_][c_] = c, dd2[b_][c_] = 1; } if (aa[i * 2 + 1][j * 2 + 2] == ' ') { b_ = b | 1 << i, c_ = 0; if (dp2[b_][c_] > x + 1) dp2[b_][c_] = x + 1, bb2[b_][c_] = b, cc2[b_][c_] = c, dd2[b_][c_] = 2; } } } } j = m, i = 0, b = 0, c = 0; while (i > 0 || j > 0) { int j_ = i == 0 ? j - 1 : j, i_ = i == 0 ? n - 1 : i - 1, b_ = bb[j][i][b][c], c_ = cc[j][i][b][c]; if (dd[j][i][b][c] & 1) { if (aa[i_ * 2 + 1][j_ * 2 + 1] == ' ') aa[i_ * 2 + 1][j_ * 2 + 1] = '.'; if (aa[i_ * 2 + 2][j_ * 2 + 1] == ' ') aa[i_ * 2 + 2][j_ * 2 + 1] = '.'; if (aa[i_ * 2 + 3][j_ * 2 + 1] == ' ') aa[i_ * 2 + 3][j_ * 2 + 1] = '.'; } if (dd[j][i][b][c] & 2) { if (aa[i_ * 2 + 1][j_ * 2 + 1] == ' ') aa[i_ * 2 + 1][j_ * 2 + 1] = '.'; if (aa[i_ * 2 + 1][j_ * 2 + 2] == ' ') aa[i_ * 2 + 1][j_ * 2 + 2] = '.'; if (aa[i_ * 2 + 1][j_ * 2 + 3] == ' ') aa[i_ * 2 + 1][j_ * 2 + 3] = '.'; } j = j_, i = i_, b = b_, c = c_; } printf("%d\n", dp[m][0][0][0] * 2); for (i = 0; i <= n * 2; i++) printf("%s", aa[i]); return 0; }

Compilation message (stderr)

connect.c: In function 'main':
connect.c:44:35: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
   44 |        b_ = (b | 1 << i) ^ 1 << i + 1, c_ = b >> i + 1 & 1;
      |                                 ~~^~~
connect.c:44:52: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   44 |        b_ = (b | 1 << i) ^ 1 << i + 1, c_ = b >> i + 1 & 1;
      |                                                  ~~^~~
connect.c:50:38: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
   50 |        b_ = (b & ~(1 << i)) ^ 1 << i + 1, c_ = b >> i + 1 & 1;
      |                                    ~~^~~
connect.c:50:55: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   50 |        b_ = (b & ~(1 << i)) ^ 1 << i + 1, c_ = b >> i + 1 & 1;
      |                                                     ~~^~~
connect.c:14:2: warning: ignoring return value of 'fgets' declared with attribute 'warn_unused_result' [-Wunused-result]
   14 |  fgets(s, 32, stdin), sscanf(s, "%d%d", &n, &m), n /= 2, m /= 2;
      |  ^~~~~~~~~~~~~~~~~~~
connect.c:16:3: warning: ignoring return value of 'fgets' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |   fgets(aa[i], m * 2 + 3, stdin);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...