機器人的運動范圍

聲明

該系列文章僅僅展示個人的解題思路和分析過程,并非一定是優質題解,重要的是通過分析和解決問題能讓我們逐漸熟練和成長,從新手到大佬離不開一個磨練的過程,加油!

原題鏈接

機器人的運動范圍icon-default.png?t=N6B9https://leetcode.cn/leetbook/read/illustration-of-algorithm/9h6vo2/

算法分析
圖1

? ? ? ? ?圖1是機器人移動范圍的網格,結合題目的描述,我們來確定變量和邏輯主體。

? ? ? ? (1)變量設網格的行數為m,列數為n,移動限定值為k,設單元格坐標為(x,y),[x]表示x的數位之和,[y]同理,可達坐標個數sum,已探索坐標列表list。

? ? ? ? (2)特殊描述:

????????①k是用于判斷移動是否合理的值,要求[x]+[y] <= k;

????????②數位之和:如數字45,[45]=4+5=9;

????????③移動方向分為上下左右,不可越界;

????????④起點為(0,0),1 <= m <= 100,1 <= n <= 100,0 <= k <= 20;

? ? ? ? (3)求取[x]:

? ? ? ? ①x < 10,[x] = x

????????②x >= 10,[x] = x - (x / 10) * 9

? ? ? ? (4)越界判斷:

????????單元格坐標為(x,y)x屬于[0,M-1]y屬于[0,N-1]xy均滿足指定取值范圍則表明未越界反之則越界

? ? ? ? (5)機器人移動:

????????傳入行數、列數、當前坐標、移動限定值、可達解個數、已訪問的坐標值列表。檢測當前坐標是否越界,若越界則return;檢測當前坐標數位和是否滿足條件,若不滿足則return;檢測當前坐標是否重復訪問,若重復訪問則return;三種情況均不滿足則將當前坐標添加至已訪問列表中,然后繼續嘗試往上下左右四個方向進行移動,重復上述過程。

? ? ? ? (6)定義一個坐標值數據結構:

????????用于記錄橫縱坐標、比較坐標以及生成基于當前坐標指定方向的坐標值。

代碼示例(C#)
//主方法
public int MovingCount(int m, int n, int k)
{if (m <= 0 || n <= 0 || k < 0) return 0;int sum = 0;List<Vector2> list = new();Search(m, n, new(0, 0), k, ref sum, ref list);return sum;
}//移動方向的枚舉值
private enum Direction
{unknown, left, right, up, down
}//坐標值數據結構
private struct Vector2
{public int x;//橫坐標public int y;//縱坐標public Vector2(int x, int y){this.x = x;this.y = y;}//比較方法public bool CompareTo(Vector2 vector){return x == vector.x && y == vector.y;}//生成基于當前坐標指定方向的坐標值public Vector2 Generate(Direction direction){return direction switch{Direction.left => new Vector2(x - 1, y),Direction.right => new Vector2(x + 1, y),Direction.up => new Vector2(x, y + 1),Direction.down => new Vector2(x, y - 1),_ => new Vector2(x, y),};}
}//坐標搜索方法
//參數:行數、列數、坐標值、移動限定值、可達解個數、已訪問的坐標值列表
private void Search(int m, int n, Vector2 vector, int k, ref int sum, ref List<Vector2> list)
{//越界檢測if (vector.x < 0 || vector.x >= m || vector.y < 0 || vector.y >= n) return;//當前坐標的數位和檢測if (DigitalSum(vector.x) + DigitalSum(vector.y) > k) return;//重復訪問檢測if (list.Exists(vec => vec.CompareTo(vector))) return;list.Add(vector);sum++;//生成當前坐標的四個方向的坐標值Vector2[] vectors ={vector.Generate(Direction.left),vector.Generate(Direction.right),vector.Generate(Direction.up),vector.Generate(Direction.down)};//搜索四個方向的坐標Search(m, n, vectors[0], k, ref sum, ref list);Search(m, n, vectors[1], k, ref sum, ref list);Search(m, n, vectors[2], k, ref sum, ref list);Search(m, n, vectors[3], k, ref sum, ref list);
}//計算指定值的數位和
private int DigitalSum(int val)
{if (val < 10) return val;return val - (val / 10) * 9;
}
算法解說

????????根據題目要求我們需要通過一個網格來模擬機器人的移動范圍,并且我們對機器人可移動的單元格進行了限定,我們從左至右和從上至下分別從小到大對坐標進行劃分,如此我們便可以唯一確定每一個單元格,如圖1所示。坐標除了用于記錄位置信息外我們還需要它提供一些特殊的方法,例如CompareTo和Generate,這兩個方法分別用于比較坐標和生成基于當前坐標指定方向的坐標,因此我們應該把它單獨為一個類。

????????其次就是我們搜索機器人移動路徑的主要方法了,可以先嘗試模擬一下,我們從起始點出發,擁有四個可移動的方向,但是這就存在三個特殊情況,,所以我們需要對每個坐標進行判斷,第一需要考慮這個坐標是否越界,第二需要考慮這個坐標是否受到移動限定值的影響,第三需要考慮這個坐標是否已經探索過,只有當以上三個情況均不滿足的時候,才應該記錄為允許移動的坐標。

????????如何將算法分析轉換為代碼,依舊是確定兩個點,一是變量,二是邏輯主體,結合算法分析中的描述即可確定我們需要定義哪些變量以及邏輯主體是什么。

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

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

相關文章

高等數學教材重難點題型總結(二)導數與微分

本章重點題目較少&#xff0c;除了*標題頁沒什么特別難的&#xff0c;本帖出于總結性的角度考慮并未囊概全部的*標&#xff0c;最后會出一期*標題的全部內容整理&#xff0c;在攻克重難點的基礎上更上一層樓。 1.根據定義求某點處的導數值 2.通過定義證明導數 3.左右導數的相關…

【數據庫】P4 過濾數據 WHERE

過濾數據 WHERE 簡介WHERE 子句操作符檢測單個值案例范圍值檢查 BETWEEN AND空值檢查 NULL 簡介 數據庫表一般包含大量的數據&#xff0c;很少需要檢索表中的所有行。我們只檢索所需數據需要指定搜索條件(search criteria)&#xff0c;搜索條件也稱為過濾條件(filter conditio…

完全備份、增量備份、差異備份、binlog日志

Top NSD DBA DAY06 案例1&#xff1a;完全備份與恢復案例2&#xff1a;增量備份與恢復案例3&#xff1a;差異備份與恢復案例4&#xff1a;binlog日志 1 案例1&#xff1a;完全備份與恢復 1.1 問題 練習物理備份與恢復練習mysqldump備份與恢復 1.2 方案 在數據庫服務器192…

問AI一個嚴肅的問題

chatgpt的問世再一次掀起了AI的浪潮&#xff0c;其實我一直在想&#xff0c;AI和人類的關系未來會怎樣發展&#xff0c;我們未來會怎樣和AI相處&#xff0c;AI真的會完全取代人類嗎&#xff0c;帶著這個問題&#xff0c;我問了下chatgpt&#xff0c;看一看它是怎么看待這個問題…

Modbus工業RFID設備在自動化生產線中的應用

傳統半自動化生產線在運作的過程&#xff0c;因為技工的熟練程度&#xff0c;專業素養的不同&#xff0c;在制造過程中過多的人為干預&#xff0c;工廠將很難對每條生產線的產能進行標準化管理和優化。如果半自動化生產線系統是通過前道工序的作業結果和檢測結果來決定產品在下…

react實現模擬彈框遮罩的自定義hook

需求描述 點擊按鈕用于檢測鼠標是否命中按鈕 代碼實現 import React from react; import {useState, useEffect, useRef} from react;// 封裝一個hook用來檢測當前點擊事件是否在某個元素之外 function useClickOutSide(ref,cb) {useEffect(()>{const handleClickOutside…

JMeter接口自動化測試實例—JMeter引用javaScript

Jmeter提供了JSR223 PreProcessor前置處理器&#xff0c;通過該工具融合了Java 8 Nashorn 腳本引擎&#xff0c;可以執行js腳本以便對腳本進行前置處理。其中比較典型的應用就是通過執行js腳本對前端數據進行rsa加密&#xff0c;如登錄密碼加密。但在這里我就簡單的應用javaScr…

PyTorch翻譯官網教程-NLP FROM SCRATCH: GENERATING NAMES WITH A CHARACTER-LEVEL RNN

官網鏈接 NLP From Scratch: Generating Names with a Character-Level RNN — PyTorch Tutorials 2.0.1cu117 documentation 使用字符級RNN生成名字 這是我們關于“NLP From Scratch”的三篇教程中的第二篇。在第一個教程中</intermediate/char_rnn_classification_tutor…

ChatGPT爆火,會給教育帶來什么樣的影響或者沖擊?

近來&#xff0c;人工智能聊天機器人ChatGPT連上熱搜&#xff0c;火爆全網。ChatGPT擁有強大的信息整合能力、自然語言處理能力&#xff0c;可謂是“上知天文&#xff0c;下知地理”&#xff0c;而且還能根據要求進行聊天、撰寫文章等。 ChatGPT一經推出&#xff0c;便迅速在社…

stop job is running for Advanced key-value store

今天虛擬機磁盤撐滿了&#xff0c;本來還能湊合運行&#xff0c;結果重啟了下&#xff0c;就報了這個 stop job is running for Advanced key-value store (1min 59s / no limit) 解決方式很簡單&#xff0c; 1、虛擬機關電源&#xff0c;任務管理器&#xff0c;關閉VM&#x…

OpenCV-Python中的圖像處理-圖像直方圖

OpenCV-Python中的圖像處理-圖像直方圖 圖像直方圖統計直方圖繪制直方圖Matplotlib繪制灰度直方圖Matplotlib繪制RGB直方圖 使用掩膜統計直方圖直方圖均衡化Numpy圖像直方圖均衡化OpenCV中的直方圖均衡化CLAHE 有限對比適應性直方圖均衡化 2D直方圖OpenCV中的2D直方圖Numpy中2D…

當Visual Studio遇到 “當前不會命中斷點.還沒有為該文檔加載任何符號“的情況

1.配置項目調試路徑&#xff1a; 2.問題解決方案&#xff1a; VS配置調試路徑不是默認路徑時&#xff0c;需要看生成的文件是否在配置路徑內&#xff0c;如果不在的話&#xff0c;可能發生"當前不會命中斷點.還沒有為該文檔加載任何符號"的情況&#xff1b; 右鍵項…

Kotlin語法

整理關鍵語法列表如下&#xff1a; https://developer.android.com/kotlin/interop?hlzh-cn官方指導鏈接 語法形式 說明 println("count ${countnum}")字符串里取值運算 val count 2 var sum 0 類型自動推導 val 定義只讀變量&#xff0c;優先 var定義可變變量…

計算機競賽 python+opencv+深度學習實現二維碼識別

0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; pythonopencv深度學習實現二維碼識別 &#x1f947;學長這里給一個題目綜合評分(每項滿分5分) 難度系數&#xff1a;3分工作量&#xff1a;3分創新點&#xff1a;3分 該項目較為新穎&…

HotSpot虛擬機之字節碼執行引擎

目錄 一、棧幀 1. 棧幀結構 2. 基于棧的解釋執行過程 二、方法調用 1. 方法調用指令 2. 分派 三、動態類型語言 四、參考資料 一、棧幀 1. 棧幀結構 棧幀是Java虛擬機棧進行方法調用和執行的數據結構&#xff0c;是方法最基本的執行單元&#xff0c;是棧的元素。一個棧…

【環境配置】Windows10終端和VSCode下能夠直接打開Anaconda-Prompt

很多小伙伴在 Windows 下做深度學習開發的時候&#xff0c;遇到終端沒有在 Linux 那么方便&#xff0c;那么我們現在就可以來設置一下&#xff1b;這樣我們也可以在文件夾內部右鍵打開終端&#xff0c;也可以在 VS Code 里面新建一個虛擬環境的控制臺&#xff1b;這里主要是針對…

佛祖保佑,永不宕機,永無bug

當我們的程序編譯通過&#xff0c;能預防的bug也都預防了&#xff0c;其它的就只能交給天意了。當然請求佛祖的保佑也是必不可少的。 下面是一些常用的保佑圖&#xff1a; 佛祖保佑圖 ——————————————————————————————————————————…

【c語言】動態內存管理(超詳細)

他治愈了身邊所有人&#xff0c;唯獨沒有治愈他自己—超脫 csdn上的朋友你們好呀&#xff01;&#xff01;今天給大家分享的是動態內存管理 &#x1f440;為什么存在動態內存分配 我們定義的局部變量在棧區創建 int n 4;//在棧上開辟4個字節大小int arr[10] { 0 };//在棧上開…

Android Socket使用TCP協議實現手機投屏

本節主要通過實戰來了解Socket在TCP/IP協議中充當的是一個什么角色&#xff0c;有什么作用。通過Socket使用TCP協議實現局域網內手機A充當服務端&#xff0c;手機B充當客戶端&#xff0c;手機B連接手機A&#xff0c;手機A獲取屏幕數據轉化為Bitmap&#xff0c;通過Socket傳遞個…

Excel設置某列或者某行不某行不可以編輯,只讀屬性

設置單元格只讀的三種方式: 1、通過單元格只讀按鈕&#xff0c;設置為只為 設置行或者列的只讀屬性&#xff0c;可以設置整行或者整列只讀 2、設置單元格編輯控件為標簽控件(標簽控件不可編輯) 3、通過鎖定行&#xff0c;鎖定行的修改。鎖定的行與只讀行的區別在于鎖定的行不…