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
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP