Advertisement
a53

dungeons

a53
Jan 19th, 2022
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.09 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int N = 405;
  5. int vizibil[N][N],pericol[N][N],x[64],y[64],sol=N*N,coins(int64_t);
  6. int di[8]= {-1,0,1,0,1,-1,-1,1};
  7. int dj[8]= {0,1,0,-1,1,-1,1,-1};
  8. char Map[N][N];
  9. int n,m,k;
  10. int64_t P[64];
  11. unordered_map<int64_t,int> invP;
  12. void readData(),solve(),getS(int64_t,vector<int>&);
  13. queue<int64_t> q;
  14. bitset<N> vizit[N];
  15. int main()
  16. {
  17. readData();
  18. solve();
  19. return 0;
  20. }
  21. void readData()
  22. {
  23. cin>>n>>m;
  24. k=0;
  25. P[0]=1;
  26. invP[P[0]]=0;
  27. /// mapez S-urile cu puteri de 2
  28. for(int i=0; i<n; i++)
  29. {
  30. cin>>Map[i];
  31. for(int j=0; j<m; j++)
  32. if(Map[i][j]=='S')
  33. {
  34. Map[i][j]='.';
  35. x[k]=i;
  36. y[k]=j;
  37. k++;
  38. P[k]=2LL*P[k-1];
  39. invP[P[k]]=k;
  40. }
  41. }
  42. assert(k<=60);
  43. /// creez harta vizibilitatilor
  44. for(int i=0; i<n; i++)
  45. for(int j=0; j<m; j++)
  46. for(int d=0,p3=1; d<8; d++,p3*=3)
  47. {
  48. int I=i+di[d];
  49. int J=j+dj[d];
  50. if(Map[I][J]=='o')
  51. vizibil[i][j]+=p3;
  52. else
  53. if(Map[I][J]=='#')
  54. vizibil[i][j]+=2*p3;
  55. }
  56. }
  57.  
  58. void solve()
  59. {
  60. q.push((1LL<<k)-1LL);
  61. for(; q.size(); q.pop())
  62. sol=min(sol,coins(q.front()));
  63. cout<<sol;
  64. }
  65. int coins(int64_t MASK)
  66. {
  67. int _coins=0;
  68. for(int i=0; i<n; i++)
  69. vizit[i].reset();
  70. vector<int> id;
  71. vector<int> sx;
  72. vector<int> sy;
  73. vector<int64_t> p2;
  74. for(;MASK;MASK-=MASK&(-MASK))
  75. p2.push_back(MASK&(-MASK));
  76. for(auto it:p2)
  77. id.push_back(invP[it]);
  78. for(auto it:id)
  79. {
  80. sx.push_back(x[it]);
  81. sy.push_back(y[it]);
  82. }
  83. int nr=id.size();
  84. /// setam deplasamentele pentru toate cele
  85. queue<int> qx,qy;
  86. qx.push(sx[0]);
  87. qy.push(sy[0]);
  88. vizit[sx[0]][sy[0]]=1;
  89. while(qx.size())
  90. {
  91. int X=qx.front();qx.pop();
  92. int Y=qy.front();qy.pop();
  93. int vizA = vizibil[X][Y];
  94. int64_t codA=0,codB=0;
  95. for(int i=0;i<nr;i++)
  96. if(vizibil[X+sx[i]-sx[0]][Y+sy[i]-sy[0]]==vizA)
  97. codA|=p2[i];
  98. else
  99. codB|=p2[i];
  100. if(codB)
  101. {
  102. q.push(codA);
  103. q.push(codB);
  104. return N*N;
  105. }
  106. for(int d=0;d<4;d++)
  107. {
  108. int I=X+di[d];
  109. int J=Y+dj[d];
  110. if(vizit[I][J])
  111. continue;
  112. vizit[I][J]=1;
  113. char ch=Map[I][J];
  114. if(ch=='.')
  115. for(int i=0;i<nr;i++)
  116. if(Map[I+sx[i]-sx[0]][J+sy[i]-sy[0]]=='X')
  117. {
  118. ch='X';
  119. break;
  120. }
  121. if(ch=='#'||ch=='X')
  122. continue;
  123. qx.push(I);
  124. qy.push(J);
  125. if(ch=='o')
  126. _coins++;
  127. }
  128. }
  129. return _coins;
  130. }
  131.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement