Advertisement
Korotkodul

СПБГУ_C_Visualizer

Dec 30th, 2021
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <queue>
  5. #include <algorithm>
  6. #include <string>
  7. #include <stack>
  8. #include <set>
  9. #include <map>
  10. #define pii pair <int,int>
  11. using namespace std;
  12. using ll = long long;
  13. using ld = long double;
  14. /*
  15. Перебор:
  16.  варианты, на каких осях меняем координаты (2^d)
  17. &#61664;
  18. Варианты, чему равен r (очевидно, что r ограничен самой короткой осью &#8211; может, это можно как-то применить?)
  19. &#61664;
  20. Варианты, на каких осях (+r), а на каких (-r).
  21. */
  22. void cv(vector <int> &v){
  23.     for (auto x: v) cout<<x<<' ';
  24.     cout<<"\n\n";
  25. }
  26.  
  27. ll d;
  28.  
  29. string two(int x, int sz){
  30.     string r = "";
  31.     while (x > 0){
  32.         r += ((x % 2) + 48);
  33.         x /= 2;
  34.     }
  35.     reverse(r.begin(), r.end());
  36.     while (r.size() < sz){
  37.         r = '0' + r;
  38.     }
  39.     return r;
  40. }
  41. vector <int> idx, now_axe;
  42. vector <int> axe;
  43. vector <int> qn; //queen
  44. vector <int> deep_axe;
  45. ll ans;
  46. ll inf = 998244353;
  47.  
  48.  
  49.  
  50. bool gd(){
  51.     bool r = 1;
  52.     for (int i = 0;i <idx.size();++i){
  53.         if (! (deep_axe[i] > 0 && deep_axe[i] <= axe[idx[i]] ) ){
  54.             r = 0;
  55.             break;
  56.         }
  57.     }
  58.     return r;
  59. }
  60.  
  61. int main()
  62. {
  63.     ios::sync_with_stdio(0);
  64.     cin.tie(0);
  65.     cout.tie(0);
  66.     cin>>d;
  67.     axe.resize(d); for (auto &x: axe) cin>>x;
  68.     qn.resize(d); for (auto &x: qn) cin>>x;
  69.     string ch_axe;
  70.  
  71.     for (int msk = 1; msk < (1 << d) ;++msk ){
  72.         ch_axe = two(msk, d);
  73.         idx.clear();
  74.         now_axe.clear();
  75.         for (int i = 0; i < d;++i){
  76.             if (ch_axe[i] == '1'){
  77.                 idx.push_back(i);
  78.                 now_axe.push_back(axe[i]);
  79.             }
  80.         }
  81.         //до куда двигаем r?
  82.         int till = *min_element(now_axe.begin(), now_axe.end());
  83.         //cout<<"till = "<<till<<"\n";
  84.         deep_axe.resize(idx.size());
  85.         string ch_r_s;
  86.         for (int ch_r = 0; ch_r < (1 << idx.size()); ++ch_r){
  87.             //cout<<two(ch_r, idx.size())<<"\n";
  88.             ch_r_s = two(ch_r, idx.size());
  89.             for (int r = 1; r < till; ++r){
  90.                 for (int i = 0; i < idx.size();++i){
  91.                     if (ch_r_s[i] == '1'){
  92.                         deep_axe[i] = qn[idx[i]] + r;
  93.                     }
  94.                     else{
  95.                         deep_axe[i] = qn[idx[i]] - r;
  96.                     }
  97.                 }
  98.                 if (!gd()) continue;
  99.                
  100.                 //cout<<ch_axe<<' '<<r<<"\n";
  101.                 //cout<<ch_r_s<<'\n';
  102.                 //ch_r_s обозначает прибавляем мы или отнимаем от координат ферзя число r по осям, которые отмечены 1 d строке ch_axe
  103.                 int cnt = 0;
  104.                 for (int i = 0; i < ch_axe.size();++i){
  105.                     if (ch_axe[i] == '0'){
  106.                         cout<<qn[i]<<' ';
  107.                     }
  108.                     else{
  109.                         if (ch_r_s[cnt] == '1'){
  110.                             cout<<qn[i] + r<<' ';
  111.                         }else{
  112.                             cout<<qn[i] - r<<' ';
  113.                         }
  114.                         cnt++;
  115.                     }
  116.                 }
  117.                 cout<<"\n\n";
  118.                 ans++;
  119.                 ans %= inf;
  120.             }
  121.         }
  122.     }
  123.     cout<<ans<<"\n";
  124. }
  125. /*
  126. 4
  127. 2 3 4 5
  128. 2 1 3 4
  129.  
  130. 3
  131. 8 8 8
  132. 3 7 5
  133.  
  134. 3
  135. 5 10 7
  136. 4 2 3
  137. */
  138.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement