Advertisement
Guest User

Untitled

a guest
Jul 20th, 2018
297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.38 KB | None | 0 0
  1. /*
  2.  ID: bradyawn
  3.  PROG: contest
  4.  LANG: C++11
  5.  */
  6.  
  7. #include <iostream>
  8. #include <algorithm>
  9. #include <iomanip>
  10. #include <fstream>
  11. #include <vector>
  12. #include <deque>
  13. #include <string>
  14. #include <cmath>
  15. #include <map>
  16. #include <unordered_map>
  17. #include <utility>
  18. #include <set>
  19. #include <unordered_set>
  20. #include <ctime>
  21. #include <queue>
  22. #include <stack>
  23. #include <bitset>
  24. #include <random>
  25. #include <cstring>
  26. #include <complex>
  27.  
  28. using namespace std;
  29.  
  30. typedef long long ll;
  31. typedef pair<int,int> i2;
  32. typedef pair<ll,ll> ll2;
  33.  
  34. int r,c,n;
  35.  
  36. struct S
  37. {
  38.     int row;
  39.     int col;
  40.     int dist;
  41. };
  42.  
  43. deque<S> d;
  44.  
  45. char grid[51][51];
  46. char sGrid[51][51];
  47. int ans[51][51];
  48.  
  49. int island[16][16];
  50.  
  51. void add(int i, int j, int prevD)
  52. {
  53.     if (!(i >= 1 && i <= r)) return;
  54.     if (!(j >= 1 && j <= c)) return;
  55.     if (grid[i][j] == '.') return;
  56.     if (grid[i][j] == 'X') d.push_front({i,j,prevD});
  57.     if (grid[i][j] == 'S') d.push_back({i,j,prevD+1});
  58.     grid[i][j] = '.';
  59. }
  60.  
  61. void fix()
  62. {
  63.     d.clear();
  64.     for (int i = 1; i <= r; i++)
  65.         for (int j = 1; j <= c; j++) grid[i][j] = sGrid[i][j];
  66. }
  67.  
  68. int dfs(int i, int j) //find distance from island at i,j to fixed island
  69. {
  70.     if (!(i >= 1 && i <= r)) return 1e9;
  71.     if (!(j >= 1 && j <= c)) return 1e9;
  72.     if (grid[i][j] != 'X') return 1e9;
  73.     grid[i][j] = '.';
  74.  
  75.     int ret = ans[i][j];
  76.  
  77.     ret = min(ret, dfs(i+1, j));
  78.     ret = min(ret, dfs(i-1, j));
  79.     ret = min(ret, dfs(i, j+1));
  80.     ret = min(ret, dfs(i, j-1));
  81.  
  82.     return ret;
  83. }
  84.  
  85. void bfs(S st)
  86. {
  87.     memset(ans, 0, sizeof ans);
  88.     fix();
  89.  
  90.     d.push_front(st);
  91.     grid[st.row][st.col] = '.';
  92.     while (!d.empty())
  93.     {
  94.         auto node = d.front(); d.pop_front();
  95.         int i = node.row;
  96.         int j = node.col;
  97.  
  98.        // grid[i][j] = '.';
  99.  
  100.         ans[i][j] = node.dist;
  101.  
  102.         add(i+1, j, node.dist);
  103.         add(i-1, j, node.dist);
  104.         add(i, j+1, node.dist);
  105.         add(i, j-1, node.dist);
  106.  
  107.  
  108.     }
  109. }
  110.  
  111. /*
  112.  void prnt()
  113.  {
  114.  for (int i = 1; i <= r; i++)
  115.  for (int j = 1; j <= c; j++) outf << ans[i][j] << " \n"[j==c];
  116.  outf << '\n';
  117.  }*/
  118.  
  119. int dp[1<<16][16];
  120.  
  121. int solve(int mask, int cur)
  122. {
  123.     int ret = 1e9;
  124.     if (dp[mask][cur] != -1) return dp[mask][cur];
  125.     if (mask == ((1 << n)-1)) return 0;
  126.     for (int i = 0; i < n; i++)
  127.         if ( ((1 << i) & mask) == 0) ret = min(ret, island[cur][i]+solve(mask | (1 << i), i));
  128.     return dp[mask][cur] = ret;
  129. }
  130.  
  131. int main()
  132. {
  133.     ifstream inf("island.in");
  134.     ofstream outf("island.out");
  135.     //outf << setprecision(10);
  136.     ios::sync_with_stdio(0); inf.tie(0);
  137.  
  138.     inf >> r >> c;
  139.  
  140.     vector<S> pts; //start points
  141.  
  142.     for (int i = 1; i <= r; i++)
  143.         for (int j = 1; j <= c; j++)
  144.         {
  145.             inf >> grid[i][j];
  146.             sGrid[i][j] = grid[i][j];
  147.         }
  148.  
  149.     for (int i = 1; i <= r; i++)
  150.         for (int j = 1; j <= c; j++)
  151.         {
  152.             if (grid[i][j] == 'X') pts.push_back({i,j,0});
  153.             dfs(i,j);
  154.         }
  155.  
  156.     n = pts.size();
  157.  
  158.     for (int i = 0; i < n; i++)
  159.     {
  160.         bfs(pts[i]); fix();
  161.         for (int j = 0; j < n; j++) island[i][j] = dfs(pts[j].row, pts[j].col);
  162.     }
  163.  
  164.     memset(dp, -1, sizeof dp);
  165.  
  166.     for (int mask = (1 << n)-1; mask >= 0; mask--)
  167.         for (int cur = 0; cur < n; cur++) solve(mask, cur);
  168.  
  169.     outf << solve(0,15) << '\n';
  170.  
  171.     return 0;
  172.  
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement