[華為OD] C卷 dfs 特殊加密算法 100

題目:

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

規則如下

1?明文為一段數字串由0-9組成

2.密碼本為數字0-9組成的二維數組

3?需要按明文串的數字順序在密碼本里找到同樣的數字串,密碼本里的數字串是由相鄰的單元?

格數字組成,上下和左右是相鄰的,注意:對角線不相鄰,同一個單元格的數字不能重復使?

用。

4??每一位明文對應密文即為密碼本中找到的單元格所在的行和列序號(序號從0開始)組成的兩個?

數字。如明文第位Data[i]對應密碼本單元格為Book[x][y],則明文第i位對應的密文為XY, X和?

Y之間用空格隔開

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

請你設計這個加密程序

示例1:

密碼本

[0 0 2]

[1 3 4]

[6 6 4]

明文:3,密文."1 1”

示例2:

示例2:

密碼本:

0 0 2

1 3 4

6 6?4

明文:"0 3”密文:0 1 1 1”

輸入描述

第一行輸入1個正整數N,代表明文的長度(1 <= N <= 200)

第二行輸入N個明文數字組成的序列Data[i](整數:0<= Data[i] <= 9)

第三行1個正整數M,代表密文的長度接下來M行,每行M個數,代表密文矩陣

輸出描述

輸出字典序最小密文?如果無法匹配,輸出"error

示例1:

輸入:

2

0 3

3

0 0 2

1 3 4

6 6 4

輸出:

0 1 1 1

示例2:

輸入:

2

0 5

3

0 0 2

1 3 4

6 6 4

輸出:

error

題解:

要在矩陣中找到連續的坐標位置,那么這種搜索就直接使用DFS搜索算法。這個題要注意有多條密文時候返回字符序最小的密文。所有搜索的時候順序應該是左->上->下->右(因為排列是先x坐標后y坐標),這樣找到第一個符合條件的數據就是最小的密文。

如果不按這個順序的話,那么就需要將多條密文序列進行排序,找出最小結果了(這個邏輯比較好理解)

這個題只有100分,但感覺還是有點難度的

代碼

import java.util.*;public class DFS1 {private static String result = "";//  private static String sumResult = "";public static void main(String[] args) {Scanner sc = new Scanner(System.in);int num = Integer.valueOf(sc.nextLine());String nums[] =sc.nextLine().split(" ");int value[] = new int[num];for(int i =0;i<nums.length;i++){value[i] = Integer.valueOf(nums[i]);}int m = Integer.valueOf(sc.nextLine());int arr[][] = new int[m][m];for(int i=0;i<m;i++){String arrs[] = sc.nextLine().split(" ");for(int j =0;j<m;j++){arr[i][j] = Integer.valueOf(arrs[j]);}}int directions[][] = {{-1,0},{0,-1},{0,1},{1,0}};  // 搜索順序 很重要,這樣第一個結果就是最小值了boolean hasdata = false;//  Map<String,List<String>> resultMap = new HashMap<>();//  List<String> resultValues = new ArrayList<>();for(int i=0;i<m;i++){for(int j=0;j<m;j++){if(arr[i][j] == value[0]){result = i+" "+j;//    sumResult = String.valueOf(i)+String.valueOf(j);//  System.out.println("first is i"+i+"j "+j);if(dfs(directions,arr,i,j,value,1,m)){hasdata = true;//  List<String> stringList = new ArrayList<>();//   stringList.add(result);//    resultMap.put(sumResult,stringList);//    resultValues.add(sumResult);break;}}}if(hasdata){break;}}if(hasdata){
//            Collections.sort(resultValues);
//            System.out.println(resultMap.get(resultValues.get(0)).get(0));System.out.println(result);}else {System.out.println("error");}}public static boolean dfs(int[][] directions, int[][] arrs, int x, int y, int[] value, int index, int m) {int presentValue = value[index];int i = 0;while (i < 4) {if(i>=4){break;}int newX = x + directions[i][0];int newY = y + directions[i][1];
//            if (newX >= 0 && newX < m && newY >= 0 && newY < m) {
//                System.out.println("newX " + newX + " newY " + newY + " arrs[newX][newY " + arrs[newX][newY] + "presentValue " + presentValue);
//            }if (newX >= 0 && newX < m && newY >= 0 && newY < m && arrs[newX][newY] == presentValue) {result += " " + newX + " " + newY;//     sumResult = sumResult + String.valueOf(newX) + String.valueOf(newY);if (index == value.length - 1) {return true;}index++;return dfs(directions, arrs, newX, newY, value, index, m);}if (newX < 0 || newX >= m || newY < 0 || newY >= m || arrs[newX][newY] != presentValue) {i++;continue;}}return false;}}

方法2:不考慮搜索順序,按照結果集排序,找出最小的

import java.util.*;public class DFS1 {private static String result = "";private static String sumResult = "";public static void main(String[] args) {Scanner sc = new Scanner(System.in);int num = Integer.valueOf(sc.nextLine());String nums[] =sc.nextLine().split(" ");int value[] = new int[num];for(int i =0;i<nums.length;i++){value[i] = Integer.valueOf(nums[i]);}int m = Integer.valueOf(sc.nextLine());int arr[][] = new int[m][m];for(int i=0;i<m;i++){String arrs[] = sc.nextLine().split(" ");for(int j =0;j<m;j++){arr[i][j] = Integer.valueOf(arrs[j]);}}//  int directions[][] = {{-1,0},{0,-1},{0,1},{1,0}};  // 搜索順序 很重要,這樣第一個結果就是最小值了int directions[][] = {{-1,0},{0,-1},{1,0},{0,1}};  // 搜索順序 很重要,這樣第一個結果就是最小值了boolean hasdata = false;Map<String,List<String>> resultMap = new HashMap<>();List<String> resultValues = new ArrayList<>();for(int i=0;i<m;i++){for(int j=0;j<m;j++){if(arr[i][j] == value[0]){result = i+" "+j;sumResult = String.valueOf(i)+String.valueOf(j);//   System.out.println("first is i"+i+"j "+j);if(dfs(directions,arr,i,j,value,1,m)){hasdata = true;List<String> stringList = new ArrayList<>();stringList.add(result);resultMap.put(sumResult,stringList);resultValues.add(sumResult);break;}}}
//            if(hasdata){
//                break;
//            }}if(hasdata){Collections.sort(resultValues);System.out.println(resultMap.get(resultValues.get(0)).get(0));//  System.out.println(result);}else {System.out.println("error");}}public static boolean dfs(int[][] directions, int[][] arrs, int x, int y, int[] value, int index, int m) {int presentValue = value[index];int i = 0;while (i < 4) {if(i>=4){break;}int newX = x + directions[i][0];int newY = y + directions[i][1];
//            if (newX >= 0 && newX < m && newY >= 0 && newY < m) {
//                System.out.println("newX " + newX + " newY " + newY + " arrs[newX][newY " + arrs[newX][newY] + "presentValue " + presentValue);
//            }if (newX >= 0 && newX < m && newY >= 0 && newY < m && arrs[newX][newY] == presentValue) {result += " " + newX + " " + newY;sumResult = sumResult + String.valueOf(newX) + String.valueOf(newY);if (index == value.length - 1) {return true;}index++;return dfs(directions, arrs, newX, newY, value, index, m);}if (newX < 0 || newX >= m || newY < 0 || newY >= m || arrs[newX][newY] != presentValue) {i++;continue;}}return false;}}

驗證結果:

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

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

相關文章

PUBG非升級實用槍皮-部分盤點

藏匿處的黑貨箱武器需要耗費高額成本才能升級 對于像我這樣的日常休閑玩家來說是一筆不小的&#xff08;巨大的&#xff01;&#xff09;負擔 其實有許多普通非升級槍皮也是不錯的選擇 今天就來盤點一下我自己日常在用的普通皮 來看看你是不是也在用一樣的 &#xff08;僅是盤點…

【OceanBase診斷調優】—— 租戶資源統計項及其查詢方法

本文主要介紹 OceanBase 數據庫中租戶資源統計項及其查詢方法。 適用版本 OceanBase 數據庫 V4.1.x、V4.2.x 版本。 CPU 資源統計項 邏輯 CPU 使用率&#xff08;線程處理請求的時間占比&#xff09;。 通過虛擬表 __all_virtual_sysstat 在 SYS 系統租戶下&#xff0c;查看…

AtCoder Beginner Contest 308 A題 New Scheme

A題&#xff1a;New Scheme 標簽&#xff1a;模擬 題意&#xff1a;給定 8 8 8個數的序列&#xff0c;詢問這些數是否滿足以下條件&#xff1a; 在 100 100 100到 675 675 675之間且能被 25 25 25整除序列是單調非遞減的 題解&#xff1a;按題意模擬判斷就好了。 代碼&#…

09.zabbix自定義模塊并使用

zabbix自定義模塊并使用 根據tcp的11中狀態獲取值&#xff0c;進行批量配置監控項 [rootyunlong66 ~]# cat /etc/zabbix/zabbix_agentd.d/tcp.conf UserParameterESTABLISHED,netstat -antp |grep -c ESTABLISHED UserParameterSYN_SENT,netstat -antp |grep -c SYN_SENT Use…

Obsidian/Typora設置圖床

在obsidian中默認圖片是保存在本地的&#xff0c;但是在要導出文檔上傳到網上時&#xff0c;由于圖片保存在本地&#xff0c;會出現無法加載圖片的問題。 這里引用的一段話&#xff1a; 這里使用picgo-core和gitee實現圖床功能&#xff0c; 參考1&#xff1a; Ubuntu下PicGO配…

Github學習

1.Git與Github 區別: Git是一個分布式版本控制系統&#xff0c;簡單的說就是一個軟件&#xff0c;用于記錄一個或若干個文件內容變化&#xff0c;以便將來查閱特點版本修訂情況的軟件。 Github是一個為用戶提高Git服務的網站&#xff0c;簡單說就是一個可以放代碼的地方。Gi…

C語言 | Leetcode C語言題解之第85題最大矩形

題目&#xff1a; 題解&#xff1a; int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize) {int m matrixSize;if (m 0) {return 0;}int n matrixColSize[0];int left[m][n];memset(left, 0, sizeof(left));for (int i 0; i < m; i) {for (int j …

SeetaFace6人臉活體檢測C++代碼實現Demo

SeetaFace6包含人臉識別的基本能力&#xff1a;人臉檢測、關鍵點定位、人臉識別&#xff0c;同時增加了活體檢測、質量評估、年齡性別估計&#xff0c;并且順應實際應用需求&#xff0c;開放口罩檢測以及口罩佩戴場景下的人臉識別模型。 官網地址&#xff1a;https://github.co…

【補充】圖神經網絡前傳——DeepWalk

論文閱讀 論文&#xff1a;https://arxiv.org/pdf/1403.6652 參考&#xff1a;【論文逐句精讀】DeepWalk&#xff0c;隨機游走實現圖向量嵌入&#xff0c;自然語言處理與圖的首次融合_隨機游走圖嵌入-CSDN博客 abstract DeepWalk是干什么的&#xff1a;在一個網絡中學習頂點…

【Mac】Ghost Buster Pro(蘋果電腦內存清理專家) v3.2.5安裝教程

軟件介紹 Ghost Buster pro是一款針對Mac系統的電腦清理和優化工具&#xff0c;可以幫助用戶清理系統垃圾、修復注冊表錯誤、卸載不需要的軟件、管理啟動項等&#xff0c;從而提高系統性能和穩定性。 安裝教程 1.打開鏡像包&#xff0c;拖動「Ghost Buster Pro」到應用程序中…

GIT SSL certificate problem

簡單來說&#xff0c;SSL 協議可以為你的 Web 瀏覽器或其他進程提供一種安全的通道&#xff0c;使服務器和客戶端之間的數據傳輸過程不被第三方竊取或篡改。這非常重要&#xff0c;特別是在處理敏感數據&#xff0c;比如信用卡信息、用戶名和密碼等情況下。 現在&#xff0c;S…

Flutter 中的 Row 小部件:全面指南

Flutter 中的 Row 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;Row 是一個水平布局的小部件&#xff0c;用于將子控件沿著水平軸排列。Row 類似于 HTML 中的 div 標簽&#xff0c;但僅限于水平布局。它非常適合用來創建行式布局&#xff0c;如表單輸入、按鈕組、標簽…

【linux軟件基礎知識】完全公平調度

完全公平調度&#xff08;CFS&#xff09; CFS根據每個進程相對于所有可運行線程總權重的權重為每個進程分配一個“時間片”。 CFS 的目標是近似“無限小”的調度持續時間&#xff0c;稱為目標延遲。 較小的目標延遲可以提高交互性并接近完美的多任務處理&#xff0c;但其代價…

【Linux網絡】Https【下】{CA認證/證書的簽發與認證/安全性/總結}

文章目錄 1.引入證書【為方案五鋪墊】1.1再談https1.2SSL/TLS1.3CA機構1.4理解數字簽名1.4繼續鋪墊1.5方案五服務端申請證書回顧一二三回顧方案四方案五過程尋找方案五的漏洞客?端對證書進?認證 2.查看證書2.1查看瀏覽器的受信任證書發布機構2.2中間?有沒有可能篡改該證書2.…

差分約束 C++ 算法例題

差分約束 差分約束 是一種特殊的 n 元一次不等式組&#xff0c;m 個約束條件&#xff0c;可以組成形如下的格式&#xff1a; { x 1 ? x 1 ′ ≤ y 1 x 2 ? x 2 ′ ≤ y 2 ? x m ? x m ′ ≤ y m \begin{cases} x_1-x_1^{} \le y_1 \\ x_2-x_2^{} \le y_2 \\ \cdots \\ x_…

數據庫的要求

本來我是不準備寫數據庫的。而且是準備從零開始&#xff0c;學習python&#xff0c;學完語言學&#xff0c;會c和寫作技法&#xff0c;再來學習數據庫 那樣做的復雜度是天量的&#xff0c;按部就班什么的具備&#xff0c;因為你完全不清楚什么時候就有這個基礎和條件&#xff0…

【53】Camunda8-Zeebe核心引擎-Partitions分區與Internal processing內部處理

Partitions分區 在Zeebe中,所有數據都是基于分區的。(一個)分區本質上是一個關于流程事件的持久化流。在broker集群中,分區分布在節點之間,因此可以將其視為分片。啟動/初始化Zeebe 集群時,用戶可以配置所需的分區數。如果使用過Kafka,這部分內容是比較相似的。 每當部…

SpringBoot集成jxls2實現復雜(多表格)excel導出

核心依賴 需求 導出多個表格&#xff0c;包含圖片&#xff0c;類似商品標簽 1.配置模板 創建一個xlsx的模板文件&#xff0c;配置如下 該模板進行遍歷了兩次&#xff0c;因為我想要導出的數據分為兩列展示&#xff0c;左右布局&#xff0c;一個循環實現不了&#xff0c;所以采…

【ARM64 常見匯編指令學習 20.1 -- ARM 偽指令 .include】

請閱讀【嵌入式開發學習必備專欄】 文章目錄 ARM 編譯指令 .include 使用介紹a.s 文件b.s 文件小結 ARM 編譯指令 .include 使用介紹 在UEFI&#xff08;統一可擴展固件接口&#xff09;開發中&#xff0c;通常會用到匯編語言文件&#xff08;.s 或 .S 文件&#xff09;。如果…

百面算法工程師 | 正則優化函數——BN、LN、Dropout

本文給大家帶來的百面算法工程師是正則優化函數&#xff0c;文章內總結了常見的提問問題&#xff0c;旨在為廣大學子模擬出更貼合實際的面試問答場景。在這篇文章中&#xff0c;我們將總結一些BN、LN、Dropout的相關知識&#xff0c;并提供參考的回答及其理論基礎&#xff0c;以…