xT30x

Untitled

Mar 15th, 2023
564
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.38 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define prm(x) x.begin(), x.end()
  4. #define srt(x) sort(prm(x))
  5. #define rvs(x) reverse(prm(x))
  6.  
  7. using namespace std;
  8. using ll = long long;
  9. using ld = long double;
  10.  
  11. vector<pair<ll, ll>> p;
  12. vector<ll> tp;
  13.  
  14. void opt(vector<vector<pair<ll, ll>>> &v)
  15. {
  16.     for (auto c1 : v)
  17.     {
  18.         for (auto c2 : c1)
  19.         {
  20.             if (c2.first == c2.second)
  21.             {
  22.                 cout << c2.first << " ";
  23.             }
  24.             else
  25.             {
  26.                 cout << c2.first << "/" << c2.second << " ";
  27.             }
  28.         }
  29.         cout << endl;
  30.     }
  31. }
  32.  
  33. void vrfy2(vector<vector<pair<ll, ll>>> &v)
  34. {
  35.  
  36.     for (int i = 0; i < 6; i++)
  37.     {
  38.         ll ax1 = 1;
  39.         ll ax2 = 1;
  40.         bool e1 = true, e2 = true;
  41.         for (int j = 0; j < 6; j++)
  42.         {
  43.             // part 1:
  44.             if (v.at(i).at(j).first == 1 || v.at(i).at(j).second == 1)
  45.             {
  46.                 e1 = false;
  47.             }
  48.             ax1 *= v.at(i).at(j).first;
  49.             ax1 *= v.at(i).at(j).second;
  50.             if (v.at(i).at(j).first == v.at(i).at(j).second)
  51.             {
  52.                 ax1 /= v.at(i).at(j).first;
  53.             }
  54.  
  55.             // part 2:
  56.             if (v.at(j).at(i).first == 1 || v.at(j).at(i).second == 1)
  57.             {
  58.                 e1 = false;
  59.             }
  60.             ax2 *= v.at(j).at(i).first;
  61.             ax2 *= v.at(j).at(i).second;
  62.             if (v.at(j).at(i).first == v.at(j).at(i).second)
  63.             {
  64.                 ax2 /= v.at(j).at(i).first;
  65.             }
  66.         }
  67.         if (ax1 != 362880 || ax2 != 362880 || e1 || e2)
  68.         {
  69.             return;
  70.         }
  71.     }
  72.  
  73.     for (int i = 0; i < 6; i += 2)
  74.     {
  75.         for (int j = 0; j < 6; j += 3)
  76.         {
  77.             bool e1 = true;
  78.             ll ax = 1;
  79.             for (int x = 0; x < 2; x++)
  80.             {
  81.                 for (int y = 0; y < 3; y++)
  82.                 {
  83.                     if (v.at(i + x).at(j + y).first == 1 || v.at(i + x).at(j + y).second == 1)
  84.                     {
  85.                         e1 = false;
  86.                     }
  87.                     ax *= v.at(i + x).at(j + y).first;
  88.                     ax *= v.at(i + x).at(j + y).second;
  89.                     if (v.at(i + x).at(j + y).first == v.at(i + x).at(j + y).second)
  90.                     {
  91.                         ax /= v.at(i + x).at(j + y).first;
  92.                     }
  93.                 }
  94.             }
  95.             if (ax != 362880 || e1)
  96.             {
  97.                 return;
  98.             }
  99.         }
  100.     }
  101.  
  102.     opt(v);
  103. }
  104.  
  105. bool vrfy1(vector<vector<pair<ll, ll>>> &v, ll x, ll y, ll c)
  106. {
  107.     if (v.at(x).at(y).first == c || v.at(x).at(y).second == c)
  108.     {
  109.         return false;
  110.     }
  111.     for (int i = 0; i < 6; i++)
  112.     {
  113.         if (v.at(x).at(i).first == c || v.at(x).at(i).second == c)
  114.         {
  115.             return false;
  116.         }
  117.         if (v.at(i).at(y).first == c || v.at(i).at(y).second == c)
  118.         {
  119.             return false;
  120.         }
  121.     }
  122.     x /= 2;
  123.     y /= 3;
  124.     for (int i = 0; i < 2; i++)
  125.     {
  126.         for (int j = 0; j < 3; j++)
  127.         {
  128.             if (v.at(x + i).at(y + j).first == c)
  129.             {
  130.                 return false;
  131.             }
  132.         }
  133.     }
  134.     return true;
  135. }
  136.  
  137. void solve(vector<vector<pair<ll, ll>>> &v, ll c)
  138. {
  139.     if (c == p.size())
  140.     {
  141.         vrfy2(v);
  142.         return;
  143.     }
  144.     ll x = p.at(c).first;
  145.     ll y = p.at(c).second;
  146.  
  147.     for (int i = 1; i <= 9; i++)
  148.     {
  149.         if (vrfy1(v, x, y, i))
  150.         {
  151.             if (tp.at(c) == 1)
  152.             {
  153.                 v.at(x).at(y).first = i;
  154.                 solve(v, c + 1);
  155.                 v.at(x).at(y).first = 0;
  156.             }
  157.             else if (tp.at(c) == 2)
  158.             {
  159.                 v.at(x).at(y).second = i;
  160.                 solve(v, c + 1);
  161.                 v.at(x).at(y).second = 0;
  162.             }
  163.             else
  164.             {
  165.                 v.at(x).at(y).first = i;
  166.                 v.at(x).at(y).second = i;
  167.                 solve(v, c + 1);
  168.                 v.at(x).at(y).first = 0;
  169.                 v.at(x).at(y).second = 0;
  170.             }
  171.         }
  172.     }
  173. }
  174. int main()
  175. {
  176.     vector<vector<pair<ll, ll>>> v(6, vector<pair<ll, ll>>(6, {0, 0}));
  177.     string ww;
  178.     for (int i = 0; i < 6; i++)
  179.     {
  180.         for (int j = 0; j < 6; j++)
  181.         {
  182.             ll n1 = 0, n2 = 0;
  183.             cin >> ww;
  184.             if (ww.size() == 3)
  185.             {
  186.  
  187.                 if (ww.at(0) != '-')
  188.                 {
  189.                     n1 = ww.at(0) - '0';
  190.                 }
  191.                 if (ww.at(2) != '-')
  192.                 {
  193.                     n2 = ww.at(2) - '0';
  194.                 }
  195.             }
  196.             else
  197.             {
  198.                 if (ww != "-")
  199.                 {
  200.                     n1 = ww.front() - '0';
  201.                     n2 = ww.front() - '0';
  202.                 }
  203.             }
  204.  
  205.             v.at(i).at(j) = {n1, n2};
  206.             if (n1 == 0 && n1 == 0)
  207.             {
  208.                 p.push_back({i, j});
  209.                 tp.push_back(3);
  210.             }
  211.             else if (n1 == 0)
  212.             {
  213.                 p.push_back({i, j});
  214.                 tp.push_back(1);
  215.             }
  216.             else if (n2 == 0)
  217.             {
  218.                 p.push_back({i, j});
  219.                 tp.push_back(2);
  220.             }
  221.         }
  222.     }
  223.     solve(v, 0);
  224.     return 0;
  225. }
  226.  
Advertisement
Add Comment
Please, Sign In to add comment