Advertisement
nikunjsoni

351

Jun 7th, 2021
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.40 KB | None | 0 0
  1. class Solution {
  2. public:
  3.     int dfs(vector<bool> &vis, vector<vector<int>> &skip, int cur, int remain) {
  4.         if(remain < 0) return 0;
  5.         if(remain == 0) return 1;
  6.         vis[cur] = true;
  7.         int rst = 0;
  8.         for(int i = 1; i <= 9; ++i){
  9.             // If vis[i] is not visited and (two numbers are adjacent or skip number is already visited)
  10.             if(!vis[i] && (skip[cur][i] == 0 || (vis[skip[cur][i]]))){
  11.                 rst += dfs(vis, skip, i, remain - 1);
  12.             }
  13.         }
  14.         vis[cur] = false;
  15.         return rst;
  16.     }
  17.    
  18.     int numberOfPatterns(int m, int n) {
  19.         // Skip array represents number to skip between two pairs
  20.         vector<vector<int>> skip(10, vector<int>(10, 0));
  21.         skip[1][3] = skip[3][1] = 2;
  22.         skip[1][7] = skip[7][1] = 4;
  23.         skip[3][9] = skip[9][3] = 6;
  24.         skip[7][9] = skip[9][7] = 8;
  25.         skip[1][9] = skip[9][1] = skip[2][8] = skip[8][2] = skip[3][7] = skip[7][3] = skip[4][6] = skip[6][4] = 5;
  26.         vector<bool> vis(10, false);
  27.        
  28.         // DFS search each length from m to n
  29.         int rst = 0;
  30.         for(int i = m; i <= n; ++i) {
  31.             rst += dfs(vis, skip, 1, i - 1) * 4;    // 1, 3, 7, 9 are symmetric
  32.             rst += dfs(vis, skip, 2, i - 1) * 4;    // 2, 4, 6, 8 are symmetric
  33.             rst += dfs(vis, skip, 5, i - 1);        // 5
  34.         }
  35.         return rst;
  36.     }
  37. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement