Advertisement
yungyao

量杯問題bitwise

Jun 23rd, 2021
434
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.33 KB | None | 0 0
  1. /*
  2.  
  3. weak        weak  we      ak   we  akwea        weak  we
  4.   weak    weak    we      ak   weak    weak    we  ak we
  5.     weakweak      we      ak   wea       ak   we    akwe
  6.       wea         we      ak   we        ak   we    akwe
  7.       wea         we      ak   we        ak   we    akwe
  8.       wea          eak  weak   we        ak    we  ak we
  9.       wea            wea  ak   we        ak     weak  we
  10.                                                       we
  11. we      ak     wea  ak       weak                     we
  12.  we    ak    wea  weak     wea  eak                   we
  13.   we  ak    we      ak   wea      wea         we      we
  14.    weak     we      ak   we        we         we      we
  15.     we      we      ak   we        we         we      we
  16.    we        wea  weak    wea    wea          weak  weak
  17. weak           wea  akw      weak                weak
  18.  
  19.  
  20. */
  21. using namespace std;
  22. #include <vector>
  23. #include <queue>
  24. #include <algorithm>
  25. #include <cmath>
  26. #include <utility>
  27. #include <bitset>
  28. #include <set>
  29. #include <string>
  30. #include <stack>
  31. #include <iomanip>
  32. #include <map>
  33. #include <memory.h>
  34. #include <deque>
  35.  
  36. #define pb push_back
  37. #define pii pair<int,int>
  38. #define F first
  39. #define S second
  40. #define LL long long
  41. #define mid (LB+RB)/2
  42. #define vvl vector <vector<LL>>
  43. #define vl vector <LL>
  44. #define mkp make_pair
  45.  
  46. //iterators
  47. #define iter(x) x.begin(),x.end()
  48. #define aiter(a,n) a,a+n
  49.  
  50. //loops
  51. #define REP(n) for (int ___=n;___--;)
  52. #define REP0(i,n) for (int i=0;i<n;++i)
  53. #define REP1(i,n) for (int i=1;i<=n;++i)
  54. #define FOR(i,b,l,k) for (int i=b;i!=l;i+=k)
  55. #define forEach(i,v) for (auto i:v)
  56.  
  57. /*
  58. yungyao so weeeeeeeeeeeeeeeeeeeeeeeeeeak
  59. 8e7 so dian
  60. FHVirus so dian
  61. youou so dian
  62. KYW so dian
  63. hubert so dian
  64. jass so dian
  65. tingyu so dian
  66. panda so dian
  67. */
  68.  
  69. //IO
  70. #include <iostream>
  71. #define theyRSOOOOOOOOODIAN ios_base::sync_with_stdio(false),cin.tie(0);
  72. //testing some stuff, still under construction
  73. //a lot more useful while debug
  74. inline void print(vector <int> v){
  75.     for (auto i:v)
  76.         cout << i << ' ';
  77.     cout << '\n';
  78. }
  79. inline void print(vector <int> v,char sep,char end){
  80.     for (auto i:v)
  81.         cout << i << sep;
  82.     cout << end;
  83. }
  84.  
  85. //constants
  86. #include <climits>
  87. const LL maxn = 0,mod = 1e9 + 7;
  88.  
  89. //workspace
  90.  
  91. //gcd
  92. int gcd(int x,int y){
  93.     return x % y ? gcd(y,x%y) : y;
  94. }
  95.  
  96. #include <unordered_set>
  97. #include <unordered_map>
  98.  
  99. int n;
  100. int H(int v[]){
  101.     int ret = 0;
  102.     REP0(i,n){
  103.         ret = (ret << 6) | v[i];
  104.     }
  105.     return ret;
  106. }
  107.  
  108. struct Node{
  109.     int f;
  110.     int method; //0 for emptying cup i, 1 for filling cup i, 2 for pouring cup i to j
  111.     int i,j;
  112. };
  113.  
  114. unordered_map <int,Node> father;
  115. #include <fstream>
  116.  
  117. inline void solve(){
  118.     int t;
  119.     unordered_set <int> vis;
  120.     ofstream fout;
  121.     fout.open("papabeard.txt");
  122.  
  123.     cin >> n;
  124.     int l[5];
  125.     REP0(i,n) cin >> l[i];
  126.     cin >> t;
  127.     fout << "由" << n << "個量杯,容量分別為";
  128.     REP0(i,n) fout << l[i] << (i != n-1 ? ", " : ",");
  129.     fout << "量出" << t << "單位的水\n";
  130.    
  131.     queue <pii> bfs;
  132.     bfs.push(mkp(0,0));
  133.  
  134.     int g = l[0],mx = l[0];
  135.     for (int i=1;i<n;++i) {mx = max(mx,l[i]);g = gcd(g,l[i]);}
  136.     if (t > mx || t % g){
  137.         fout << "不存在方式可以量出t單位的水\n";
  138.         return;
  139.     }
  140.  
  141.     int end;
  142.     while (bfs.size()){
  143.         auto [h,d] = bfs.front(); bfs.pop();
  144.         int v[5],v_copy[5];
  145.         int h_c = h;
  146.         for (int i=n;i--;){
  147.             v[i] = h_c & ((1 << 6) - 1);
  148.             h_c >>= 6;
  149.             if (v[i] == t){
  150.                 stack <Node> sk;
  151.                 while (h){
  152.                     sk.push(father[h]);
  153.                     h = father[h].f;
  154.                 }
  155.                 fout << "共需" << d << "步\n";
  156.                 for (int s=1;sk.size();sk.pop(),++s){
  157.                     auto [fr,m,i,j] = sk.top();
  158.                     fout << "第" << s << "步:";
  159.                     if (!m){
  160.                         fout << "清空量杯" << i+1 << '\n';
  161.                     }
  162.                     else if (m == 1){
  163.                         fout << "裝滿量杯" << i+1 << '\n';
  164.                     }
  165.                     else{
  166.                         fout << "將量杯" << i+1 << "的水倒入量杯" << j+1 << '\n';
  167.                     }
  168.                 }
  169.                 return;
  170.             }
  171.         }
  172.  
  173.         for (int i=0;i<n;++i){
  174.             for (int j=0;j<n;++j){
  175.                 if (i == j){
  176.                     if (v[i]){
  177.                         REP0(k,n) v_copy[k] = v[k];
  178.                         v_copy[i] = 0;
  179.                         auto h_c = H(v_copy);
  180.                         if (vis.find(h_c) == vis.end()){
  181.                             bfs.push(mkp(h_c,d+1));
  182.                             vis.insert(h_c);
  183.                             father[h_c] = {h,0,i,-1};
  184.                         }
  185.                     }
  186.                     if (v[i] != l[i]){
  187.                         REP0(k,n) v_copy[k] = v[k];
  188.                         v_copy[i] = l[i];
  189.                         auto h_c = H(v_copy);
  190.                         if (vis.find(h_c) == vis.end()){
  191.                             bfs.push(mkp(h_c,d+1));
  192.                             vis.insert(h_c);
  193.                             father[h_c] = {h,1,i,-1};
  194.                         }
  195.                     }
  196.                 }
  197.                 else{
  198.                     REP0(k,n) v_copy[k] = v[k];
  199.                     if (v[i] + v[j] <= l[j]){
  200.                         v_copy[i] = 0;
  201.                         v_copy[j] = v[i] + v[j];
  202.                     }
  203.                     else{
  204.                         v_copy[i] = v[i] + v[j] - l[j];
  205.                         v_copy[j] = l[j];
  206.                     }
  207.                    
  208.                     auto h_c = H(v_copy);
  209.                     if (vis.find(h_c) == vis.end()){
  210.                         bfs.push(mkp(h_c,d+1));
  211.                         vis.insert(h_c);
  212.                         father[h_c] = {h,2,i,j};
  213.                     }
  214.                 }
  215.             }
  216.         }
  217.     }
  218. }
  219.  
  220. signed main(){
  221.     //theyRSOOOOOOOOODIAN
  222.     //for (int ;cin;)//use in multi-testcases and end in EOF problems
  223.     //int t,i=1;for (cin >> t;i<=t;++i)//use in multi-testcases problems
  224.     //cout << "Case #" << i << ": ",//use in Google, FB competitions
  225.     solve();//always used
  226.     return 0;
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement