Submission #136201

#TimeUsernameProblemLanguageResultExecution timeMemory
136201gs14004Connect (CEOI06_connect)C++17
100 / 100
39 ms17528 KiB
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <limits.h> #include <math.h> #include <time.h> #include <iostream> #include <functional> #include <numeric> #include <algorithm> #include <stack> #include <queue> #include <deque> #include <vector> #include <string> #include <bitset> #include <map> #include <set> using namespace std; typedef long long lint; typedef long double llf; typedef pair<int, int> pi; char str[30][100], ret[30][100]; int r, c, dp[13][41][1<<12][2]; int f(int x, int y, int bit, int lef){ if(y == c / 2) return 0; if(x == r / 2){ if(lef) return 1e9; return dp[x][y][bit][lef] = f(0, y+1, bit, 0); } if(~dp[x][y][bit][lef]) return dp[x][y][bit][lef]; int ret = 1e9; if(str[2*x+1][2*y+1] == 'X'){ if(lef && (bit >> x) % 2 == 0){ ret = min(ret, f(x+1, y, bit, 0) + 2); } if(!lef && str[2*x+2][2*y+1] == ' ' && (bit >> x) % 2 == 0){ ret = min(ret, f(x+1, y, bit, 1)); } if(!lef && (bit >> x) % 2 == 1){ ret = min(ret, f(x+1, y, bit ^ (1<<x), 0) + 2); } if(!lef && str[2*x+1][2*y+2] == ' ' && (bit >> x) % 2 == 0){ ret = min(ret, f(x+1, y, bit ^ (1<<x), 0)); } } else{ if(!lef && (bit >> x) % 2 == 0){ ret = min(ret, f(x+1, y, bit, 0)); } if(lef && (bit >> x) % 2 == 1){ ret = min(ret, f(x+1, y, bit ^ (1<<x), 0) + 4); } if(!lef && (bit >> x) % 2 == 1 && str[2*x+1][2*y+2] == ' '){ ret = min(ret, f(x+1, y, bit, 0) + 2); } if(lef && (bit >> x) % 2 == 0 && str[2*x+1][2*y+2] == ' '){ ret = min(ret, f(x+1, y, bit ^ (1<<x), 0) + 2); } if(lef && (bit >> x) % 2 == 0 && str[2*x+2][2*y+1] == ' '){ ret = min(ret, f(x+1, y, bit, 1) + 2); } if(!lef && (bit >> x) % 2 == 0 && str[2*x+1][2*y+2] == ' ' && str[2*x+2][2*y+1] == ' '){ ret = min(ret, f(x+1, y, bit ^ (1<<x), 1)); } if(!lef && (bit >> x) % 2 == 1 && str[2*x+2][2*y+1] == ' '){ ret = min(ret, f(x+1, y, bit ^ (1<<x), 1) + 2); } } return dp[x][y][bit][lef] = ret; } void track(int x, int y, int bit, int lef){ if(y == c / 2) return; if(x == r / 2){ track(0, y+1, bit, 0); return; } if(str[2*x+1][2*y+1] == 'X'){ if(lef && (bit >> x) % 2 == 0 && f(x, y, bit, lef) == f(x+1, y, bit, 0) + 2){ track(x+1, y, bit, 0); } else if(!lef && str[2*x+2][2*y+1] == ' ' && (bit >> x) % 2 == 0 && f(x, y, bit, lef) == f(x+1, y, bit, 1)){ str[2*x+2][2*y+1] = '.'; track(x+1, y, bit, 1); } else if(!lef && (bit >> x) % 2 == 1 && f(x, y, bit, lef) == f(x+1, y, bit ^ (1<<x), 0) + 2){ track(x+1, y, bit ^ (1<<x), 0); } else if(!lef && str[2*x+1][2*y+2] == ' ' && (bit >> x) % 2 == 0 && f(x, y, bit, lef) == f(x+1, y, bit ^ (1<<x), 0)){ str[2*x+1][2*y+2] = '.'; track(x+1, y, bit ^ (1<<x), 0); } else{ assert(0); } } else{ if(!lef && (bit >> x) % 2 == 0 && f(x, y, bit, lef) == f(x+1, y, bit, 0)){ track(x+1, y, bit, 0); } else if(lef && (bit >> x) % 2 == 1 && f(x, y, bit, lef) == f(x+1, y, bit ^ (1<<x), 0) + 4){ str[2*x+1][2*y+1] = '.'; track(x+1, y, bit ^ (1<<x), 0); } else if(!lef && (bit >> x) % 2 == 1 && str[2*x+1][2*y+2] == ' ' && f(x, y, bit, lef) == f(x+1, y, bit, 0) + 2){ str[2*x+1][2*y+1] = '.'; str[2*x+1][2*y+2] = '.'; track(x+1, y, bit, 0); } else if(lef && (bit >> x) % 2 == 0 && str[2*x+1][2*y+2] == ' ' && f(x, y, bit, lef) == f(x+1, y, bit ^ (1<<x), 0) + 2){ str[2*x+1][2*y+2] = '.'; str[2*x+1][2*y+1] = '.'; track(x+1, y, bit ^ (1<<x), 0); } else if(lef && (bit >> x) % 2 == 0 && str[2*x+2][2*y+1] == ' ' && f(x, y, bit, lef) == f(x+1, y, bit, 1) + 2){ str[2*x+2][2*y+1] = '.'; str[2*x+1][2*y+1] = '.'; track(x+1, y, bit, 1); } else if(!lef && (bit >> x) % 2 == 0 && str[2*x+1][2*y+2] == ' ' && str[2*x+2][2*y+1] == ' ' && f(x, y, bit, lef) == f(x+1, y, bit ^ (1<<x), 1)){ str[2*x+2][2*y+1] = '.'; str[2*x+1][2*y+2] = '.'; str[2*x+1][2*y+1] = '.'; track(x+1, y, bit ^ (1<<x), 1); } else if(!lef && (bit >> x) % 2 == 1 && str[2*x+2][2*y+1] == ' ' && f(x, y, bit, lef) == f(x+1, y, bit ^ (1<<x), 1) + 2){ str[2*x+2][2*y+1] = '.'; str[2*x+1][2*y+1] = '.'; track(x+1, y, bit ^ (1<<x), 1); } else{ assert(0); } } } int main(){ memset(dp, -1, sizeof(dp)); scanf("%d %d\n",&r,&c); for(int i=0; i<r; i++){ fgets(str[i], 88, stdin); } cout << f(0, 0, 0, 0) << endl; track(0, 0, 0, 0); for(int i=0; i<r; i++) cout << str[i]; }

Compilation message (stderr)

connect.cpp: In function 'int main()':
connect.cpp:143:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d\n",&r,&c);
  ~~~~~^~~~~~~~~~~~~~~~~
connect.cpp:145:8: warning: ignoring return value of 'char* fgets(char*, int, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   fgets(str[i], 88, stdin);
   ~~~~~^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...