leetcode 351アンドロイドシステム携帯電話ロック解除
アンドロイドにはジェスチャーロック解除のインタフェースがあり、3 x 3の点で描かれたメッシュであることが知られています.
2つの整数をあげて、それぞれmとnで、そのうち1≦m≦n≦9です.では、どのくらいのロック解除ジェスチャーがあるかを統計してください.少なくともm点を通過する必要がありますが、最大n点を超えないものを通過します.リンク:https://leetcode-cn.com/problems/android-unlock-patterns
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;
}
};