Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 Android 잠금 해제 패턴

<시간/>

Android 3x3 키 잠금 화면과 두 개의 정수 m과 n이 있고 m과 n의 값이 1 ≤ m ≤ n ≤ 9 범위에 있다고 가정합니다. Android 잠금 화면의 잠금 해제 패턴의 총 수를 계산해야 합니다. 최소 m개의 키로 구성되며 최대 n개의 키로 구성됩니다.

규칙은 각 패턴이 최소 m개의 키와 최대 n개의 키를 연결해야 한다는 것과 같습니다. 모든 키는 고유해야 합니다. 패턴에서 두 개의 연속 키를 연결하는 선이 다른 키를 통과하는 경우 다른 키가 패턴에서 이전에 선택되어 있어야 합니다. 허용되지 않는 선택되지 않은 키를 통해 건너뛰기. 사용된 키의 순서가 중요합니다.

C++의 Android 잠금 해제 패턴

따라서 입력이 m =1, n =1과 같으면 출력은 9가 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 10 x 10 크기의 배열 건너뛰기를 정의합니다.

  • dfs() 함수를 정의하면 노드, len, 방문한 배열이 필요합니다.

  • len이 0과 같으면 -

    • 1 반환

  • 방문[노드] :=참

  • ret :=0

  • initialize i :=1의 경우, i <=9일 때 업데이트(i를 1만큼 증가), −

    • Visited[i]가 거짓이고 (skip[node, i]가 0과 같거나 Visited[skip[node, i]]가 0이 아닌 경우) -

      • ret :=ret + dfs(i, len - 1, 방문)

  • 방문[노드] :=false

  • 리턴 렛

  • 주요 방법에서 다음을 수행하십시오 -

  • 건너뛰기를 0으로 채우기

  • 건너뛰기[1, 3] :=건너뛰기[3, 1] :=2

  • 건너뛰기[1, 7] :=건너뛰기[7, 1] :=4

  • 건너뛰기[3, 9] :=건너뛰기[9, 3] :=6

  • 건너뛰기[7, 9] :=건너뛰기[9, 7] :=8

  • 건너뛰기[4, 6] :=건너뛰기[6, 4] :=건너뛰기[2, 8] :=건너뛰기[8, 2] :=건너뛰기[3, 7] :=건너뛰기[7, 3] :=건너뛰기[ 1, 9] :=건너뛰기[9, 1] :=5

  • 크기가 10인 방문 배열을 정의합니다.

  • ret :=0

  • i:=m 초기화의 경우, i <=n일 때 업데이트(i를 1만큼 증가), −

    • ret :=ret + (dfs(1, i - 1, 방문))

    • ret :=ret + (dfs(2, i - 1, 방문))

    • ret :=ret + dfs(5, i - 1, 방문)

  • 리턴 렛

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int skip[10][10];
   int dfs(int node, int len, vector<bool>& visited){
      if (len == 0)
         return 1;
      visited[node] = true;
      int ret = 0;
      for (int i = 1; i <= 9; i++) {
         if (!visited[i] && (skip[node][i] == 0 || visited[skip[node][i]])) {
            ret += dfs(i, len - 1, visited);
         }
      }
      visited[node] = false;
      return ret;
   }
   int numberOfPatterns(int m, int n){
      memset(skip, 0, sizeof(skip));
      skip[1][3] = skip[3][1] = 2;
      skip[1][7] = skip[7][1] = 4;
      skip[3][9] = skip[9][3] = 6;
      skip[7][9] = skip[9][7] = 8;
      skip[4][6] = skip[6][4] = skip[2][8] = skip[8][2] = skip[3][7] = skip[7][3] = skip[1][9] = skip[9][1] = 5;
      vector<bool> visited(10);
      int ret = 0;
      for (int i = m; i <= n; i++) {
         ret += (dfs(1, i - 1, visited) * 4);
         ret += (dfs(2, i - 1, visited) * 4);
         ret += dfs(5, i - 1, visited);
      }
      return ret;
   }
};
main(){
   Solution ob;
   cout << (ob.numberOfPatterns(1,1));
}

입력

1, 1

출력

9