貪心算法與老鼠走迷宮

2022-01-02 Java教學與小提琴耿祥義

收錄於話題 #課外讀物 69個

貪心算法與老鼠走迷宮

耿祥義

     只要學過數組就可以看懂,即學過教材第2,3章即可(略微用到類和對象的最基本的知識,見第4章,當然我可以不用,把算法都寫到主類的main方法裡,但那樣做我覺得代碼不好看!)

教材介紹二維碼:

單擊閱讀原文下載原始碼:

連結:

https://pan.baidu.com/s/18EvAMu89mjxusQf_8LnPxA

提取碼: 8ty6

1.貪心算法   

       貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。即不從整體最優上加以考慮,算法得到的是在某種意義上的局部最優解 。    貪心算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇。也就是說,不從整體最優上加以考慮,做出的只是在某種意義上的局部最優解。貪心算法的特點是一步一步地進行,以當前情況為基礎,根據某個算法作最優選擇,而不考慮各種可能的整體情況,通過每一步貪心選擇,可得到局部最優解。由於貪心算法每一步是局部最優解,因此,如果使用貪心算法,必須要判斷是否得到了最優解。      例如,蒙眼爬山,蒙眼爬山者每次在周圍選擇一個最陡峭的方向前進一小步(最優選擇),但是蒙眼爬山者最後爬山的山可能不是最高的山(多峰山),假設蒙眼爬山者攜帶了一個自動通報海拔高度的小儀器,每次都報告海拔高度,當蒙眼爬山者發現周圍沒有陡峭的方向可走了,報告海拔高度恰好是想要的高度,那就找到了最優解,否則就知道自己旋入了局部最優解,無法繼續下去了。     貪心算法僅僅是一種思想而已,不像您熟悉的選擇法排序,有明確的算法步驟。    讓二維數組的單元代表迷宮的點。單元值取Integer的最大值Integer.MAX_VALUE代表出口,單元值取Integer的最小值Integer.MIN_VALUE代表牆,單元值在最大值和最小值之間代表路點(初值是0)。    老鼠每次貪心的辦法如下(這裡稱二維數組單元為路點,其值為路值):  (1)如果發現當前路點不是出口(最大值),即不是最優解,就降低優先度,將當前路值減1,進行(2),否則進行(5)  (2)在當前路點的東西南北方向選出路值比當前路值大的最大的新路點,如果找到進行(3)否則回到(1)。    如果路點的路值不會被減到等於牆的值(Integer.MIN_VALUE),就一定能到達出口,否則某個路點或牆會被當成出口(因為Integer.MIN_VALUE-1等於Integer.MAX_VALUE,老鼠陷入局部最優解)。   下列運行效果中,顯示老鼠找到出口(如果二維數組單元多,可以用Long類)。顯示了老鼠在迷宮中走的過程。最後輸出的二維數組,如果路值是-1表示老鼠走過此路點1次,-2老鼠走過此路點2次....。

連結:

https://pan.baidu.com/s/18EvAMu89mjxusQf_8LnPxA

提取碼: 8ty6

   public static void main(String args[]){      int Y= Integer.MAX_VALUE;//最優解      int N = Integer.MIN_VALUE;//無解       int maze[][] =    {{0,N,0,0,0},      Mouse jerry = new Mouse();      jerry.walkMaze(maze,Y,N);    int mousePI = 0; //老鼠初始位置    int mousePJ = 0; //老鼠初始位置    public void walkMaze(int maze[][],int yes,int no) {      columns = maze[0].length;      System.out.println("迷宮初始狀態:");      //貪心算法:當前位置周圍的最大的整數之一是局部最優解之一,      while(maze[mousePI][mousePJ]!=Y){ //如果不是最優解         System.out.printf("老鼠達到位置(%d,%d)\n",mousePI,mousePJ);         maze[mousePI][mousePJ] = maze[mousePI][mousePJ]-1;//降低優先度         int max = maze[mousePI][mousePJ];         if(mousePI<rows-1){ //以下算法:在當前位置的周圍尋找最優解(最優位置):            if(maze[mousePI+1][mousePJ]>max){               max = maze[mousePI+1][mousePJ];              if(maze[mousePI-1][mousePJ]>max){               max = maze[mousePI-1][mousePJ];              if(maze[mousePI][mousePJ+1]>max){               max = maze[mousePI][mousePJ+1];              if(maze[mousePI][mousePJ-1]>max){               max = maze[mousePI][mousePJ-1];       System.out.println("\n找到最優解:"+maze[mousePI][mousePJ]);     System.out.printf("老鼠位置(%d,%d)\n",mousePI,mousePJ);    void showMaze(){ //輸出二維數組        for(int i=0;i<rows;i++) {            for(int j=0;j<columns;j++){                  System.out.printf("%6s","#");//代表牆                  System.out.printf("%6s","*");//代表出口                  System.out.printf("%6s",""+maze[i][j]);

相關焦點

  • 跟耿老師學Java:貪心算法與老鼠走迷宮
    貪心算法與老鼠走迷宮耿祥義只要學過數組就可以看懂,即學過教材第2,3章即可(略微用到類和對象的最基本的知識,見第4章,當然我可以不用,把算法都寫到主類的main方法裡,但那樣做我覺得代碼不好看!).貪心算法   貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。
  • 【算法】老鼠走迷宮
    老鼠走迷官(一)說明老鼠走迷宮是遞迴求解的基本題型,我們在二維陣列中使用2表示迷宮牆壁,使用1來表
  • 詳解貪心算法
    也就是說貪心算法並不從整體最優考慮,它所作出的選擇只是在某種意義上的局部最優選擇。當然,希望貪心算法得到的最終結果也是整體最優的。雖然貪心算法不能對所有問題都得到整體最優解,但對許多問題它能產生整體最優解。如單源最短路經問題,最小生成樹問題等。在一些情況下,即使貪心算法不能得到整體最優解,其最終結果卻是最優解的很好近似。
  • 每日一道貪心算法
    (百度百科)貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。貪心算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。
  • 程式設計師算法基礎——貪心算法
    前言貪心是人類自帶的能力,貪心算法是在貪心決策上進行統籌規劃的統稱。
  • 貪心算法:加油站
    可以看一下公眾號左下角的「算法匯總」,「算法匯總」已經把題目順序編排好了,文章順序即刷題順序,這是全網最詳細的刷題順序了,方便錄友們從頭打卡學習,「算法匯總」會持續更新!❞134.貪心算法(方法一)直接從全局進行貪心選擇,情況如下:情況一:如果gas的總和小於cost總和,那麼無論從哪裡出發,一定是跑不了一圈的情況二:rest[i] = gas[i]-cost[i]為一天剩下的油,i從0開始計算累加到最後一站,如果累加沒有出現負數,說明從0出發,油就沒有斷過,那麼0就是起點。
  • 一文詳解貪心算法
    也就是說貪心算法並不從整體最優考慮,它所作出的選擇只是在某種意義上的局部最優選擇。當然,希望貪心算法得到的最終結果也是整體最優的。雖然貪心算法不能對所有問題都得到整體最優解,但對許多問題它能產生整體最優解。如單源最短路經問題,最小生成樹問題等。在一些情況下,即使貪心算法不能得到整體最優解,其最終結果卻是最優解的很好近似。
  • 一文搞懂貪心算法
    顧名思義,貪心算法總是作出在當前看來最好的選擇。也就是說貪心算法並不從整體最優考慮,它所作出的選擇只是在某種意義上的局部最優選擇。當然,希望貪心算法得到的最終結果也是整體最優的。雖然貪心算法不能對所有問題都得到整體最優解,但對許多問題它能產生整體最優解。如單源最短路經問題,最小生成樹問題等。
  • (貪心算法系列一)
    ❞周一本周正式開始了貪心算法,在關於貪心算法,你該了解這些!中,我們介紹了什麼是貪心以及貪心的套路。「貪心的本質是選擇每一階段的局部最優,從而達到全局最優。」有沒有啥套路呢?周二在貪心算法:分發餅乾中講解了貪心算法的第一道題目。這道題目很明顯能看出來是用貪心,也是入門好題。
  • Java 實現貪心算法實例介紹
    假定問題可以分解,並且在過程的每一步都選擇局部最優即「貪心選擇」,那麼可以稱為貪心算法。這裡的重點是問題「可拆分」:即問題可以被描述為一組相似的子問題。大多數情況下,貪心算法都採用遞歸實現。即使有諸多限制,像計算資源限制、限制執行時間、API 或其它限制,貪心算法仍然有辦法找到合理的解決方案。
  • C語言最常用的貪心算法
    貪心算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。貪心算法沒有固定的算法框架,算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無後效性(即某個狀態以後的過程不會影響以前的狀態,只與當前狀態有關。)
  • 小白帶你學---貪心算法
    貪心算法(Greedy Algorithm) 簡介貪心算法,又名貪婪法,是尋找最優解問題的常用方法,這種方法模式一般將求解過程分成
  • 貪心算法:合併區間
    局部最優可以推出全局最優,找不出反例,試試貪心。那有同學問了,本來不就應該合併最大右邊界麼,這和貪心有啥關係?有時候貪心就是常識!else {                result.push_back(intervals[i]);            }        }        return result;    }};空間複雜度:O(1),不算result數組(返回值所需容器佔的空間)總結對於貪心算法
  • leetcode算法之貪心
    今天來盤一盤 **貪心算法 ** 這類題目使用python刷題分類整理的筆記,請參考: https
  • 老外自製捕鼠器,當貪心老鼠衝進鐵圈,難以置信的場面發生了
    老外自製捕鼠器,當貪心老鼠衝進鐵圈,難以置信的場面發生了讀萬卷書不如行萬裡路,行萬裡路不如閱人無數,歡迎收看本期內容。說到老鼠相信這是很多人都非常討厭的一種動物,尤其是在農村中隨處可見他們的身影,只要是有老鼠的存在,人們的糧食將會遭受到很大的損失,如今在生活中出現了各種各樣的捕鼠神器,這些神器的用法可以說是各有千秋,這不就在前段時間一位老外自製惡毒捕鼠器,當貪心老鼠衝進圈,難以置信的場面發生,這到底是怎麼一回事呢?下面小編帶大家一起來了解一下。
  • C語言最常用的貪心算法就這麼被攻克了
    貪心算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。貪心算法沒有固定的算法框架,算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無後效性(即某個狀態以後的過程不會影響以前的狀態,只與當前狀態有關。)
  • 真正了解貪心算法,這是一篇精華入門總結...
    本文介紹了貪心算法,是一種在每一步選擇中都採取在當前狀態下最有利的選擇,從而得到最優的算法。
  • 來見識一下貪心算法:Jump Game
  • 用經典例題輕鬆幫你搞定貪心算法
    運用貪心算法求解問題時,會將問題分為若干個子問題,可以將其想像成俄羅斯套娃,利用貪心的原則從內向外依次求出當前子問題的最優解,也就是該算法不會直接從整體考慮問題,而是想要達到局部最優。貪心算法最關鍵的部分在於貪心策略的選擇,貪心選擇的意思是對於所求問題的整體最優解可以通過一系列的局部最優選擇求得。而必須注意的是,貪心選擇必須具備無後效性,也就是某個狀態不會影響之前求得的局部最優解。
  • 經典算法題 :貪心算法(大眾點評筆試題)
    ,沒有使用貪心策略的是()A、  Prim算法B、  Kruskal算法C、  Dijkstra算法D、  KMP算法請說一下原因,比如描述一下各個算法的特點。提升算法能力,小編帶來了一份高效入門書單。 01  趣學算法編輯推薦:本書從算法之美娓娓道來,沒有高深的原理,也沒有枯燥的公式,通過趣味故事引出算法問題,包含50多個實例及完美圖解,結合學生提問,分析算法本質,並給出代碼實現的詳細過程和運行結果。