C++ 中的安全破解


假設我們有一個用密碼保護的箱子。密碼是由 n 位數字組成的序列,每位數字可以是前 k 個數字 0, 1, ..., k-1 中的一個。因此,當我們輸入密碼時,最後輸入的 n 位數字將自動與正確的密碼進行匹配。

例如,假設正確的密碼是“563”,如果我們輸入“285639”,則箱子將開啟,因為正確的密碼與輸入密碼的字尾匹配。我們必須找到任何保證在某個時刻開啟箱子的最小長度密碼。

當輸入為 n = 2,k = 2 時,結果可以是“01100”、“00110”、“10011”、“11001”中的任何一個。

為了解決這個問題,我們將遵循以下步驟:

  • 定義一個名為 visited 的集合
  • 定義一個函式 dfs(),它將接收 s、k 作為引數。
  • 從 i := 0 開始,當 i < k 時,更新(i 加 1),執行:
    • temp := s 與 i 拼接成字串
    • 如果 visited 中不存在 temp,則:
      • 將 temp 插入 visited
      • temp := 獲取 temp 從索引 1 到結尾的子字串
      • dfs(temp, k)
      • ret := ret 與 i 拼接成字串
  • 在主方法中,執行以下操作:
  • 如果 n 等於 1 且 k 等於 1,則:
    • 返回 "0"
  • ret := 空字串,s := 空字串
  • 從 i := 0 開始,當 i < n - 1 時,更新(i 加 1),執行:
    • s := s 與 "0" 拼接
  • dfs(s, k)
  • 從 i := 0 開始,當 i < n - 1 時,更新(i 加 1),執行:
    • ret := ret 與 "0" 拼接
  • 返回 ret

讓我們看看下面的實現以更好地理解:

示例

線上演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   set <string> visited;
   string ret;
   string crackSafe(int n, int k) {
      if(n == 1 && k == 1) return "0";
      ret = "";
      string s = "";
      for(int i = 0; i < n - 1; i++){
         s += "0";
      }
      dfs(s, k);
      for(int i = 0; i < n - 1; i++) ret += "0";
      return ret;
   }
   void dfs(string s, int k) {
      string temp;
      for(int i = 0; i < k; i++){
         temp = s + to_string(i);
         if(!visited.count(temp)){
            visited.insert(temp);
            temp = temp.substr(1);
            dfs(temp, k);
            ret += to_string(i);
         }
      }
   }
};
main(){
   Solution ob;
   cout << (ob.crackSafe(2,2));
}

輸入

2
2

輸出

01100

更新於:2020年6月2日

290 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.