Beingamanforever

ICPC Contest-week1-A

Sep 29th, 2024 (edited)
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. mt19937_64 RNG(chrono::steady_clock::now().time_since_epoch().count());
  5. #define NeedForSpeed                  \
  6.     ios_base::sync_with_stdio(false); \
  7.     cin.tie(NULL);                    \
  8.     cout.tie(NULL);
  9. #define int long long
  10. #define all(x) (x).begin(), (x).end()
  11. typedef vector<int> vi;
  12. typedef vector<bool> vb;
  13. typedef vector<vi> vvi;
  14. typedef vector<pair<int, int>> vpi;
  15. #define f first
  16. #define s second
  17. #define endl "\n"
  18. const int mod = 1000000007;
  19. int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
  20. vector<vector<char>> grid;
  21. string invalid;
  22. int n;
  23. int matchlen;
  24. // 8 possible moves (all unique)
  25. int dx[8] = {1, 1, -1, -1, 2, 2, -2, -2};
  26. int dy[8] = {2, -2, 2, -2, 1, -1, 1, -1};
  27. int totalcnt = 0;
  28. map<char, pair<int, int>> mp;
  29. void dfs(char key, int idx, int cnt)
  30. {
  31.     if (idx == matchlen)
  32.     {
  33.         return;
  34.     }
  35.     if (cnt == n)
  36.     {
  37.         totalcnt++;
  38.         return;
  39.     }
  40.     int r = mp[key].f;
  41.     int c = mp[key].s;
  42.     for (int i = 0; i < 8; i++)
  43.     {
  44.         int nr = r + dx[i];
  45.         int nc = c + dy[i];
  46.         // validity check
  47.         if (nr >= 0 && nr < 4 && nc >= 0 && nc < 3 && grid[nr][nc] != '.' && grid[nr][nc] != invalid[idx])
  48.         {
  49.             dfs(grid[nr][nc], 0, cnt + 1);
  50.         }
  51.         else if (nr >= 0 && nr < 4 && nc >= 0 && nc < 3 && grid[nr][nc] != '.' && grid[nr][nc] == invalid[idx])
  52.         {
  53.             dfs(grid[nr][nc], idx + 1, cnt + 1);
  54.         }
  55.     }
  56.     return;
  57. }
  58. signed main()
  59. {
  60.     NeedForSpeed;
  61.     int m, k;
  62.     cin >> n >> m >> k;
  63.     // grid constructed
  64.     grid.push_back({'1', '2', '3'});
  65.     grid.push_back({'4', '5', '6'});
  66.     grid.push_back({'7', '8', '9'});
  67.     grid.push_back({'.', '0', '.'});
  68.     // hash the grid, row-column of the grid
  69.     for (int i = 0; i < 4; ++i)
  70.     {
  71.         for (int j = 0; j < 3; ++j)
  72.         {
  73.             if (grid[i][j] != '.')
  74.             {
  75.                 mp[grid[i][j]] = {i, j};
  76.             }
  77.         }
  78.     }
  79.     invalid = to_string(m);
  80.     matchlen = invalid.length();
  81.     char key = static_cast<char>(k);
  82.     int idx = 0;
  83.     dfs(key, idx, 0);
  84.     cout << totalcnt << endl;
  85.     return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment