【2024最新華為OD-C/D卷試題匯總】[支持在線評測] 特殊加密算法(200分) - 三語言AC題解(Python/Java/Cpp)

🍭 大家好這里是清隆學長 ,一枚熱愛算法的程序員

? 本系列打算持續跟新華為OD-C/D卷的三語言AC題解

💻 ACM銀牌🥈| 多次AK大廠筆試 | 編程一對一輔導

👏 感謝大家的訂閱? 和 喜歡💗

📎在線評測鏈接

https://app5938.acapp.acwing.com.cn/contest/2/problem/OD1082

🌍 評測功能需要 ? 訂閱專欄 ? 后私信聯系清隆解鎖~

🍓OJ題目截圖

在這里插入圖片描述

文章目錄

    • 📎在線評測鏈接
    • 🍓OJ題目截圖
    • 🥝 特殊加密算法
      • 問題描述
      • 輸入格式
      • 輸出格式
      • 樣例輸入
      • 樣例輸出
      • 樣例解釋
      • 數據范圍
      • 題解
      • 參考代碼

🥝 特殊加密算法

問題描述

有一種特殊的加密算法,明文為一段數字串,經過密碼本查找轉換,生成另一段密文數字串。規則如下:

  1. 明文為一段由 0-9 組成的數字串。
  2. 密碼本為由數字 0-9 組成的二維數組。
  3. 需要按明文串的數字順序在密碼本里找到同樣的數字串,密碼本里的數字串是由相鄰的單元格數字組成,上下和左右是相鄰的,注意:對角線不相鄰,同一個單元格的數字不能重復使用。
  4. 每一位明文對應密文即為密碼本中找到的單元格所在的行和列序號(序號從 0 開始)組成的兩個數字。如明文第 i i i D a t a [ i ] Data[i] Data[i] 對應密碼本單元格為 B o o k [ x ] [ y ] Book[x][y] Book[x][y],則明文第 i i i 位對應的密文為 X Y XY XY X X X Y Y Y 之間用空格隔開。

如果有多條密文,返回字符序最小的密文。如果密碼本無法匹配,返回 “error”。

輸入格式

第一行輸入 1 個正整數 N N N,代表明文的長度 ( 1 ≤ N ≤ 200 ) (1 \le N \le 200) (1N200)

第二行輸入 N N N 個明文數字組成的序列 D a t a [ i ] Data[i] Data[i](整數: 0 ≤ D a t a [ i ] ≤ 9 0 \le Data[i] \le 9 0Data[i]9)。

第三行 1 個正整數 M M M,代表密文的長度。

接下來 M M M 行,每行 M M M 個數,代表密文矩陣。

輸出格式

輸出字典序最小密文。如果無法匹配,輸出 “error”。

樣例輸入

輸入 1

2
0 3
3
0 0 2
1 3 4
6 6 4

輸入 2

2
0 5
3
0 0 2
1 3 4
6 6 4

樣例輸出

輸出 1

0 1 1 1

輸出 2

error

樣例解釋

樣例 1 中,明文 “0 3” 可以在密碼本中找到對應的路徑,且字典序最小的密文為 “0 1 1 1”。

樣例 2 中,明文 “0 5” 無法在密碼本中找到對應的路徑,因此輸出 “error”。

數據范圍

  • 1 ≤ N ≤ 200 1 \le N \le 200 1N200
  • 0 ≤ D a t a [ i ] ≤ 9 0 \le Data[i] \le 9 0Data[i]9
  • 1 ≤ M ≤ 200 1 \le M \le 200 1M200

題解

這道題的核心在于使用深度優先搜索(DFS)來遍歷密碼本,尋找符合條件的路徑。需要從每一個可能的起點開始搜索,并記錄路徑。如果找到多條路徑,選擇字典序最小的那條。

參考代碼

  • Python
import sysdef dfs(x, y, k, visited, result):visited[x][y] = Trueresult.append(x)result.append(y)if k == n - 1:return Truefor idx in range(4):nx = x + dx[idx]ny = y + dy[idx]if 0 <= nx < m and 0 <= ny < m and not visited[nx][ny] and matrix[nx][ny] == data[k + 1]:if dfs(nx, ny, k + 1, visited, result):return Truevisited[x][y] = Falseresult.pop()result.pop()return Falsen = int(input())
data = list(map(int, input().split()))
m = int(input())
matrix = [list(map(int, input().split())) for _ in range(m)]
dx = [-1, 0, 0, 1]
dy = [0, -1, 1, 0]for i in range(m):for j in range(m):if matrix[i][j] == data[0]:visited = [[False] * m for _ in range(m)]result = []if dfs(i, j, 0, visited, result):print(' '.join(map(str, result)))sys.exit()print("error")
  • Java
import java.util.*;public class Main {static int n, m;static int[] data;static int[][] matrix;static int[] dx = {-1, 0, 0, 1};static int[] dy = {0, -1, 1, 0};public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();data = new int[n];for (int i = 0; i < n; i++) {data[i] = sc.nextInt();}m = sc.nextInt();matrix = new int[m][m];for (int i = 0; i < m; i++) {for (int j = 0; j < m; j++) {matrix[i][j] = sc.nextInt();}}for (int i = 0; i < m; i++) {for (int j = 0; j < m; j++) {if (matrix[i][j] == data[0]) {boolean[][] visited = new boolean[m][m];List<Integer> result = new ArrayList<>();if (dfs(i, j, 0, visited, result)) {for (int k = 0; k < result.size(); k++) {System.out.print(result.get(k));if (k < result.size() - 1) {System.out.print(" ");}}return;}}}}System.out.println("error");}static boolean dfs(int x, int y, int k, boolean[][] visited, List<Integer> result) {visited[x][y] = true;result.add(x);result.add(y);if (k == n - 1) {return true;}for (int idx = 0; idx < 4; idx++) {int nx = x + dx[idx];int ny = y + dy[idx];if (nx >= 0 && nx < m && ny >= 0 && ny < m && !visited[nx][ny] && matrix[nx][ny] == data[k + 1]) {if (dfs(nx, ny, k + 1, visited, result)) {return true;}}}visited[x][y] = false;result.remove(result.size() - 1);result.remove(result.size() - 1);return false;}
}
  • Cpp
#include <bits/stdc++.h>using namespace std;int n, m;
vector<int> plaintext;
vector<vector<int>> matrix;
int dx[4] = {-1, 0, 0, 1};
int dy[4] = {0, -1, 1, 0};bool dfs(int x, int y, int k, vector<vector<int>>& visited, vector<int>& result) {visited[x][y] = 1;result.push_back(x);result.push_back(y);if (k == n - 1) {return true;}for (int idx = 0; idx < 4; idx++) {int nx = x + dx[idx];int ny = y + dy[idx];if (nx >= 0 && nx < m && ny >= 0 && ny < m && !visited[nx][ny] && matrix[nx][ny] == plaintext[k + 1]) {if (dfs(nx, ny, k + 1, visited, result)) {return true;}}}visited[x][y] = 0;result.pop_back();result.pop_back();return false;
}int main() {cin >> n;plaintext.resize(n);for (int i = 0; i < n; i++) {cin >> plaintext[i];}cin >> m;matrix.resize(m, vector<int>(m));for (int i = 0; i < m; i++) {for (int j = 0; j < m; j++) {cin >> matrix[i][j];}}for (int i = 0; i < m; i++) {for (int j = 0; j < m; j++) {if (matrix[i][j] == plaintext[0]) {vector<vector<int>> visited(m, vector<int>(m, 0));vector<int> result;if (dfs(i, j, 0, visited, result)) {for (int k = 0; k < result.size(); k++) {cout << result[k];if (k < result.size() - 1) {cout << " ";}}return 0;}}}}cout << "error" << endl;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36760.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36760.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36760.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Rust 跨平臺-Android 和鴻蒙 OS

1. 安裝 rustup rustup 是 Rust 的安裝和版本管理工具 $ curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh 該命令會安裝 rusup 和最新的穩定版本的 Rust&#xff1b;包括&#xff1a; rustc Rust 編譯器&#xff0c;用于將 Rust 代碼編譯成可執行文件或庫。 ca…

技術速遞|Visual Studio Code 的 .NET MAUI 擴展現已正式發布

作者&#xff1a;Maddy Montaquila 排版&#xff1a;Alan Wang 今天&#xff0c;我們非常高興地宣布 .NET MAUI VS Code 擴展插件結束了預覽階段&#xff0c;并將包含一些期待已久的新功能 - 包括 XAML IntelliSense 和 Hot Reload&#xff01; 什么是 .NET MAUI 擴展插件&…

GuLi商城-商品服務-API-三級分類-刪除-頁面效果

一步步學習Vue太慢了&#xff0c;準備跳過前端的學習&#xff0c;直接使用前端完整的項目 下載依賴npm install&#xff0c;會報錯&#xff0c;排查了好久 我安裝的是Node14&#xff0c;所以必須要安裝4.14 Vscode終端輸入&#xff1a;npm install node-sass4.14 輸入&#x…

【Android面試八股文】如果需要在Activity間傳遞大量的數據怎么辦?

文章目錄 1. 使用Intent傳遞數據2. 使用靜態變量3. 使用Parcelable或Serializable接口4. 使用文件5. 使用數據庫存儲6. 使用ContentProvider7. 匿名共享內存(Ashmem)總結在Android開發中,如果需要在Activity之間傳遞大量數據,可以采取以下幾種方法: 1. 使用Intent傳遞數據…

【博士每天一篇文獻-綜述】A survey on few-shot class-incremental learning

閱讀時間&#xff1a;2023-12-19 1 介紹 年份&#xff1a;2024 作者&#xff1a;田松松&#xff0c;中國科學院半導體研究所&#xff1b;李璐思&#xff0c;老道明大學助理教授&#xff1b;李偉軍&#xff0c;中國科學院半導體研究所AnnLab&#xff1b; 期刊&#xff1a; Neu…

LearnOpenGL - Android OpenGL ES 3.0 使用 FBO 進行離屏渲染

系列文章目錄 LearnOpenGL 筆記 - 入門 01 OpenGLLearnOpenGL 筆記 - 入門 02 創建窗口LearnOpenGL 筆記 - 入門 03 你好&#xff0c;窗口LearnOpenGL 筆記 - 入門 04 你好&#xff0c;三角形OpenGL - 如何理解 VAO 與 VBO 之間的關系LearnOpenGL - Android OpenGL ES 3.0 繪制…

《Windows API每日一練》6.4 程序測試

前面我們討論了鼠標的一些基礎知識&#xff0c;本節我們將通過一些實例來講解鼠標消息的不同處理方式。 本節必須掌握的知識點&#xff1a; 第36練&#xff1a;鼠標擊中測試1 第37練&#xff1a;鼠標擊中測試2—增加鍵盤接口 第38練&#xff1a;鼠標擊中測試3—子窗口 第39練&…

3.imput 字符串常用方法 字符串倒序,切片

1.input input()函數接收一個標準輸入數據返回string類型 2.字符串常用方法 upper()將字符串中的小寫字母變為大寫 lower()大寫變小寫 len()獲取長度 count(子字符串)統計某個字符出現的次數 index(子字符串)可以返回子字符串出現的位置, rindex從右邊找 find(子字符串)可以返回…

vite-ts-cesium項目集成mars3d修改相關的包和配置參考

如果vite技術棧下使用原生cesium&#xff0c;請參考下面文件的包和配置修改&#xff0c;想用原生創建的viewer結合我們mars3d的功能的話。 1. package.json文件 "dependencies": {"cesium": "^1.103.0","mars3d": "^3.7.18&quo…

重啟ubuntu后命令行出現(initramfs),無圖形界面問題。

由于ubuntu內部軟件問題&#xff0c;需要重啟ubuntu&#xff0c;導致重啟后圖像界面消失&#xff0c;出現如下的命令行&#xff1a; (initramfs): 這里表示進入圖形界面初始化時&#xff0c;某個分區的文件損壞&#xff0c;損壞文件名稱會在上方顯示。 解決方法&#xff1a;…

深度學習 - Transformer 組成詳解

整體結構 1. 嵌入層&#xff08;Embedding Layer&#xff09; 生活中的例子&#xff1a;字典查找 想象你在讀一本書&#xff0c;你不認識某個單詞&#xff0c;于是你查閱字典。字典為每個單詞提供了一個解釋&#xff0c;幫助你理解這個單詞的意思。嵌入層就像這個字典&#xf…

Micrometer+ZipKin分布式鏈路追蹤

目錄 背景MicrometerMicrometer與ZipKin之間的關系專業術語分布式鏈路追蹤原理 ZipKin安裝下載 MicrometerZipKin 案例演示相關文獻 背景 一個系統頁面上的按鈕點擊到結果反饋&#xff0c;在微服務框架里&#xff0c;是由N個服務組成返回結果&#xff0c;中間可能經過a->b-…

【Electron】Electron入門實現

Electron 學習筆記 Electron 是一個開源框架&#xff0c;允許開發者使用網頁技術&#xff08;HTML、CSS 和 JavaScript&#xff09;來構建跨平臺的桌面應用程序。它由 GitHub 開發并維護&#xff0c;最初是為了支持開發 Atom 編輯器。Electron 結合了 Chromium&#xff08;用于…

密碼學及其應用 —— 對稱加密技術

1. 對稱加密、流加密和塊加密 1.1 對稱加密 對稱加密&#xff08;也稱為密鑰加密&#xff09;是一種加密方式&#xff0c;其中加密和解密使用相同的密鑰。這種加密方法基于二進制層面的操作&#xff0c;如XOR&#xff08;異或&#xff09;、SHIFT&#xff08;位移&#xff09;…

Redis Stream Redisson Stream

目錄 一、Redis Stream1.1 場景1&#xff1a;多個客戶端可以同時接收到消息1.1.1 XADD - 向stream添加Entry&#xff08;發消息 &#xff09;1.1.2 XREAD - 從stream中讀取Entry&#xff08;收消息&#xff09;1.1.3 XRANGE - 從stream指定區間讀取Entry&#xff08;收消息&…

【DevExpress】WPF DevExpressMVVM 24.1版本開發指南

DevExpressMVVM WPF 環境安裝 前言重要Bug&#xff08;必看&#xff09;環境安裝控件目錄Theme 主題LoginWindow 登陸窗口INavigationService 導航服務DockLayout Dock類型的畫面布局TreeView 樹狀列表注意引用類型的時候ImageSource是PresentationCore程序集的博主找了好久&am…

[筆記] keytool 導入服務器證書和證書私鑰

背景 我當前手頭已有一個服務器證書和對應的私鑰&#xff0c;現在需要轉換為 Java KeyStore 格式使用&#xff0c;找了一大圈才發現 keytool 無法直接導入服務器證書和私鑰&#xff0c;當然證書可以直接導入&#xff0c;但是私鑰是無法直接導入。找了一大圈發現可以先將服務器…

LeetCode題解:1669. 合并兩個鏈表,JavaScript,詳細注釋

原題鏈接&#xff1a; https://leetcode.cn/problems/merge-in-between-linked-lists/ 解題思路&#xff1a; 注意該題傳入的a和b是鏈表的索引&#xff0c;而不是節點的值先遍歷list1&#xff0c;找到a-1和b1節點將a-1的next指向list2的頭節點在將list2的尾節點的next指向b1節…

Navicat 外網連接 mysql (1、通過SSH方式內網訪問 2、對外開放3306端口)

1、通過SSH方式內網訪問 直接常規方式使用IP、賬號密碼連接&#xff0c;失敗 SSH方式&#xff1a; 常規 選項卡中&#xff1a;localhost錄入數據庫賬號密碼 SSH 選項卡中&#xff1a;勾選使用SSH&#xff0c;輸入服務器IP、賬號、密碼 如果出現該錯誤&#xff0c;可能是服務器…

計算機網絡重點名詞解釋整理

名詞解釋 GPTVersion 一、網絡協議 網絡協議 數據交換的規則 組成&#xff1a;語義、語法、定時 二、DHCP DHCP 動態規劃主機配置協議 作用&#xff1a;讓計算機自動獲取IP地址 特點&#xff1a;即插即用&#xff0c;不需要手動設置 三、信號的基本調制方法以及定義 …