Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Android Unlock Patterns ใน C++


สมมติว่ามีหน้าจอล็อกแบบ Android 3x3 และจำนวนเต็มสองตัว m และ n ค่าของ m และ n อยู่ในช่วง 1 ≤ m ≤ n ≤ 9 เราต้องนับจำนวนรูปแบบปลดล็อกทั้งหมดของหน้าจอล็อก Android ซึ่งประกอบด้วยกุญแจขั้นต่ำ m ตัวและสูงสุด n ตัว

กฎคือ แต่ละรูปแบบต้องเชื่อมกุญแจอย่างน้อย m ตัวและสูงสุด n ตัว กุญแจทั้งหมดต้องไม่ซ้ำกัน หากมีเส้นเชื่อมกุญแจสองตัวติดกันในรูปแบบผ่านกุญแจอื่นๆ กุญแจอื่นๆ นั้นต้องถูกเลือกในรูปแบบก่อนหน้านี้ การกระโดดข้ามกุญแจที่ยังไม่ได้เลือกไม่ได้ ลำดับของกุญแจที่ใช้มีความสำคัญ

Android Unlock Patterns ใน C++

เช่น ถ้าอินพุทเป็น m = 1, n = 1 ผลลัพธ์จะเป็น 9

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนดังนี้ −

  • กำหนดอาร์เรย์ skip ขนาด 10 x 10

  • กำหนดฟังก์ชัน dfs() รับ node, len, อาร์เรย์ visited

  • ถ้า len เท่ากับ 0 แล้ว −

    • คืนค่า 1

  • visited[node] := true

  • ret := 0

  • ลูป i := 1 ถึง 9 ทำ −

    • ถ้า visited[i] เป็น false และ (skip[node][i] เป็น 0 หรือ visited[skip[node][i]] ไม่เป็นศูนย์) แล้ว −

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

  • visited[node] := false

  • คืนค่า ret

  • จากเมธอดหลักทำดังนี้ −

  • เติม skip ด้วย 0

  • 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

  • กำหนดอาร์เรย์ visited ขนาด 10

  • ret := 0

  • ลูป i := m ถึง n ทำ −

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

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

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

  • คืนค่า ret

ตัวอย่าง

ลองดูการติดตั้งต่อไปนี้เพื่อให้เข้าใจได้ดีขึ้น −

#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