leetcode 351アンドロイドシステム携帯電話ロック解除


アンドロイドにはジェスチャーロック解除のインタフェースがあり、3 x 3の点で描かれたメッシュであることが知られています.
2つの整数をあげて、それぞれmとnで、そのうち1≦m≦n≦9です.では、どのくらいのロック解除ジェスチャーがあるかを統計してください.少なくともm点を通過する必要がありますが、最大n点を超えないものを通過します.リンク:https://leetcode-cn.com/problems/android-unlock-patterns
class Solution {
public:
    int numberOfPatterns(int m, int n) {
        vector> skip(10, vector(10, 0));
        //  skip            ,    1 3,   2
        //          ,  3 1    
        skip[1][3] = skip[3][1] = 2;
        skip[1][7] = skip[7][1] = 4;
        skip[3][9] = skip[9][3] = 6;
        skip[4][6] = skip[6][4] = skip[2][8] = skip[8][2] = 5; 
        skip[1][9] = skip[9][1] = skip[3][7] = skip[7][3] = 5;
        skip[7][9] = skip[9][7] = 8;
        int result = 0;
        vector visited(10, false);
        //    ,           
        for(int i = m; i<=n; i++){
            //   1,3,7,9       ,   i    ,      1  ,        
            result += DFS(1,visited,skip,i-1)*4;
            //2,4,6,8  
            result += DFS(2,visited,skip,i-1)*4;
            //  5  
            result += DFS(5,visited,skip,i-1); 
        }
        return result;
    }
    //    
    int DFS(int current, vector& visited, vector>& skip,int remainKeyCount){
        if(remainKeyCount == 0){
            return 1;
        }
        int result = 0;
        //        ,         
        visited[current] = true;
        
        for(int i = 1; i <= 9; i++){
            //       i                
              int crossThroughNumber = skip[current][i];
              //        i       ,              (visited[crossThroughNumber])               (currentThrough=0)
              if(!visited[i] && (crossThroughNumber == 0 ||visited[crossThroughNumber])){
                 result += DFS(i,visited,skip,remainKeyCount-1); 
              }
        }
        //       
        visited[current] = false;
        return result;
    }
};