fork(67) download
  1. #include<iostream>
  2. #include<queue>
  3. #include<map>
  4. #include<cassert>
  5. #include<cstring>
  6. #include<climits>
  7. using namespace std;
  8.  
  9. int W, H, N;
  10.  
  11. int dx[] = {1, -1, 0, 0};
  12. int dy[] = {0, 0, -1, 1};
  13.  
  14. int calc(int i, int j) {
  15. if(W <= H)
  16. return i + W * j;
  17. return H * i + j;
  18. }
  19.  
  20. bool get(int bitmask, int i, int j) {
  21. return (bitmask&(1<<calc(i,j)));
  22. }
  23.  
  24. int bfs(int bitmask) {
  25. int dist[W][H];
  26. memset(dist, -1, sizeof dist);
  27.  
  28. int maxDist = 0;
  29. queue<pair<int,int>> Q;
  30.  
  31. for(int i = 0; i < W; i++)
  32. for(int j = 0; j < H; j++)
  33. if(get(bitmask, i, j)) {
  34. dist[i][j] = 0;
  35. Q.push({i, j});
  36. }
  37. assert(Q.size() == N);
  38.  
  39. while(!Q.empty()) {
  40. int x = Q.front().first;
  41. int y = Q.front().second;
  42. maxDist = max(maxDist, dist[x][y]);
  43. Q.pop();
  44.  
  45. for(int d = 0; d < 4; d++) {
  46. int newx = x + dx[d];
  47. int newy = y + dy[d];
  48.  
  49. if(newx >= W || newy >= H || newx < 0 || newy < 0)
  50. continue;
  51. if(dist[newx][newy] == -1) {
  52. dist[newx][newy] = dist[x][y] + 1;
  53. Q.push({newx, newy});
  54. }
  55. }
  56. }
  57.  
  58. /*
  59. for(int i = 0; i < W; i++) {
  60. for(int j = 0; j < H; j++)
  61. cout << get(bitmask, i, j) << ' ';
  62. cout << '\n';
  63. }
  64. cerr << "^ VAL IS = " << maxDist << "\n\n";
  65. */
  66. return maxDist;
  67. }
  68.  
  69. map<pair<int,int>, int> dp;
  70.  
  71. int solve(int bitmask, int left) {
  72. if(left == 0) {
  73. return bfs(bitmask);
  74. }
  75. if(dp.find({bitmask, left}) != dp.end()) {
  76. return dp[{bitmask, left}];
  77. }
  78. int minDistance = INT_MAX;
  79. for(int i = 0; i < W; i++)
  80. for(int j = 0; j < H; j++)
  81. if(!get(bitmask, i, j)) {
  82. int val = solve((bitmask|(1<<calc(i, j))), left-1);
  83. minDistance = min(minDistance, val);
  84. }
  85. return dp[{bitmask, left}] = minDistance;
  86. }
  87.  
  88. int main() {
  89. while(cin >> W >> H >> N) {
  90. dp.clear();
  91. cout << solve(0, N) << '\n';
  92. }
  93. }
  94.  
Success #stdin #stdout 1.07s 16648KB
stdin
4 4 3
2 3 2
5 1 1
28 1 5
14 2 5
4 7 5
stdout
2
1
2
3
2
2