国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

回溯算法

ctriptech / 706人閱讀

摘要:回溯算法主要思想回溯算法的基本思想是從一條路往前走,能進(jìn)則進(jìn),不能進(jìn)則退回來,換一條路再試。回溯算法說白了就是窮舉法。回溯算法也叫試探法,它是一種系統(tǒng)地搜索問題的解的方法。用回溯算法解決問題的一般步驟為定義一個解空間,它包含問題的解。

回溯算法 主要思想

回溯算法的基本思想是:從一條路往前走,能進(jìn)則進(jìn),不能進(jìn)則退回來,換一條路再試。八皇后問題就是回溯算法的典型,第一步按照順序放一個皇后,然后第二步符合要求放第2個皇后,如果沒有位置符合要求,那么就要改變第一個皇后的位置,重新放第2個皇后的位置,直到找到符合條件的位置就可以了。回溯在迷宮搜索中使用很常見,就是這條路走不通,然后返回前一個路口,繼續(xù)下一條路。回溯算法說白了就是窮舉法。不過回溯算法使用剪枝函數(shù),剪去一些不可能到達(dá) 最終狀態(tài)(即答案狀態(tài))的節(jié)點,從而減少狀態(tài)空間樹節(jié)點的生成。回溯法是一個既帶有系統(tǒng)性又帶有跳躍性的的搜索算法。它在包含問題的所有解的解空間樹中,按照深度優(yōu)先的策略,從根結(jié)點出發(fā)搜索解空間樹。算法搜索至解空間樹的任一結(jié)點時,總是先判斷該結(jié)點是否肯定不包含問題的解。如果肯定不包含,則跳過對以該結(jié)點為根的子樹的系統(tǒng)搜索,逐層向其祖先結(jié)點回溯。否則,進(jìn)入該子樹,繼續(xù)按深度優(yōu)先的策略進(jìn)行搜索。回溯法在用來求問題的所有解時,要回溯到根,且根結(jié)點的所有子樹都已被搜索遍才結(jié)束。而回溯法在用來求問題的任一解時,只要搜索到問題的一個解就可以結(jié)束。這種以深度優(yōu)先的方式系統(tǒng)地搜索問題的解的算法稱為回溯法,它適用于解一些組合數(shù)較大的問題。回溯算法也叫試探法,它是一種系統(tǒng)地搜索問題的解的方法。回溯算法的基本思想是:從一條路往前走,能進(jìn)則進(jìn),不能進(jìn)則退回來,換一條路再試。用回溯算法解決問題的一般步驟為:

定義一個解空間,它包含問題的解。

利用適于搜索的方法組織解空間。

利用深度優(yōu)先法搜索解空間。

利用限界函數(shù)避免移動到不可能產(chǎn)生解的子空間。

解決迷宮問題 解決思想

將迷宮問題對應(yīng)為二維數(shù)組,數(shù)組中只有兩種值0和1,其中0,1分別表示通路和墻。不過在解決這個問題的時候一般要在最外面添加一個圍墻,這里設(shè)置每個圍墻都為1,這樣有利于防止當(dāng)走到了迷宮的出口處還會向前走,這個并不一定,只是最一般的方法,也是最有利于理解的方法。這里的利用到了回溯法,需要走到了一個位置,然后向四處試探,如果有一個方向可以走了就將當(dāng)前的點壓入棧,并且標(biāo)記當(dāng)前點以便于區(qū)分是否走過,如果四處都無出路,只需要回到前一個走到的點,然后從前一個點再換一個方向重新走

代碼
import java.util.Stack;

/**
 * Created by chenjiabing on 17-5-5.
 */
class position {
    public int row;
    public int col;

    public position(int row, int col) {
        this.col = col;
        this.row = row;
    }

    public position() {
        row = 0;
        col = 0;
    }

    public String toString() {
        return "(" + (row - 1) + " ," + (col - 1) + ")";
    }  //這里由于四周圍上了墻,所以這里的輸出就要在原來的基礎(chǔ)上減一
}


class Main {
    private int[][] maze = null;
    private Stack stack = null;  //創(chuàng)建一個棧用于存儲狀態(tài)
    private int row;   //行數(shù)
    private int col;
    boolean[][] p = null;    //這里的p是用來標(biāo)記已經(jīng)走過的點,初始化為false

    public boolean end(int i, int j) {
        return i == row && j == col;
    }

    public Main(int[][] maze) {
        stack = new Stack();
        row = maze[0].length;// 行數(shù)
        col = maze.length;   //列數(shù)
        p = new boolean[row + 2][col + 2];
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                p[i][j] = false;    //初始化
            }
        }
        this.maze = maze;


    }

    public void findPath() {

        //創(chuàng)建一個新的迷宮,將兩邊都圍上墻,也就是在四周都填上1的墻,形成新的迷宮,主要的目的就是防止走到迷宮的邊界的出口的位置還會繼續(xù)向前走
        //因此需要正確的判斷是否在邊界線上,所以要在外圍加上一堵墻,
        int[][] temp = new int[row + 2][col + 2];
        for (int i = 0; i < row + 2; i++) {
            for (int j = 0; j < col + 2; j++) {
                temp[0][j] = 1;   //第一行圍上
                temp[row + 1][j] = 1;  //最后一行圍上
                temp[i][0] = temp[i][col + 1] = 1;  //兩邊的圍上
            }
        }


        // 將原始迷宮復(fù)制到新的迷宮中
        for (int i = 0; i < row; ++i) {
            for (int j = 0; j < col; ++j) {
                temp[i + 1][j + 1] = maze[i][j];
            }
        }


        int i = 1;
        int j = 1;
        p[i][j] = true;
        stack.push(new position(i, j));
        //這里是是將走到的點入棧,然后如果前后左右都走不通的話才出棧
        while (!stack.empty() && !end(i, j)) {


           //下面就開始在四周試探,如果有路就向前走,順序分別是右,下,上,左,當(dāng)然這是隨便定義的,不過一般都是現(xiàn)向下和右的
            if (temp[i][j + 1] == 0 && p[i][j + 1] == false)//這里如果不在四周加上墻,那么在到達(dá)邊界判斷的時候就會出現(xiàn)超出數(shù)組的索引的錯誤,因為到達(dá)邊界再加一就會溢出
            {
                p[i][j + 1] = true;
                stack.push(new position(i, j + 1));
                j++;
            } else if (temp[i + 1][j] == 0 && p[i + 1][j] == false)//如果下面可以走的話,講當(dāng)前點壓入棧,i++走到下一個點
            {
                p[i + 1][j] = true;
                stack.push(new position(i + 1, j));
                i++;
            } else if (temp[i][j - 1] == 0 && p[i][j - 1] == false) {
                p[i][j - 1] = true;
                stack.push(new position(i, j - 1));
                j--;
            } else if (temp[i - 1][j] == 0 && p[i - 1][j] == false) {
                p[i - 1][j] = true;
                stack.push(new position(i - 1, j));
                i--;
            } else   //前后左右都不能走
            {
                System.out.println(i + "---------" + j);
                stack.pop();   //這個點不能走通,彈出
                if (stack.empty())      //如果此棧中已經(jīng)沒有點了,那么直接跳出循環(huán)
                {
                    System.out.println("沒有路徑了,出不去了");
                    return;    //直接退出了,下面就不用找了
                }
                i = stack.peek().row;   //獲得最新點的坐標(biāo)
                j = stack.peek().col;

            }

            //如果已經(jīng)到達(dá)了邊界,那么直接可以出去了,不需要繼續(xù)向前走了,這里是規(guī)定邊界的任意為0的位置都是出口
            //如果不加這個判斷的話,那么當(dāng)?shù)竭_(dá)邊界的時候,只有走到不能再走的時候才會輸出路線,那種線路相對這個而言是比較長的
            if (j == temp[0].length - 2) {   //如果已經(jīng)到達(dá)邊界了,那么當(dāng)前的位置就是出口,就不需要再走了
                Stack pos = new Stack();

                System.out.println("路徑如下:");

                for (int count = 0; count < stack.size(); count++) {
                    System.out.println(stack.elementAt(count));
                }


            }
        }


    }

    public static void main(String args[]) {
        int[][] maze = {
                {0, 1, 0, 0, 0},
                {0, 1, 0, 1, 0},
                {0, 0, 0, 0, 0},
                {0, 1, 1, 1, 0},
                {0, 0, 0, 1, 0}
        };
        Main main = new Main(maze);
        main.findPath();

    }

}
更多文章請移步本人博客

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70021.html

相關(guān)文章

  • 回溯算法講解--適用于leetcode絕大多數(shù)回溯題目

    摘要:什么是回溯算法回溯法是一種系統(tǒng)搜索問題解空間的方法。解空間定義為與數(shù)字長度相同。最后,為什么要掌握回溯法因為懂了回溯法之后筆試?yán)锏暮芏囝}就算不了,起碼成功運(yùn)行到之間是沒問題的。 什么是回溯算法?回溯法是一種系統(tǒng)搜索問題解空間的方法。為了實現(xiàn)回溯,需要給問題定義一個解空間。說到底它是一種搜索算法。只是這里的搜索是在一個叫做解空間的地方搜索。而往往所謂的dfs,bfs都是在圖或者樹這種數(shù)據(jù)...

    saucxs 評論0 收藏0
  • LeetCode 關(guān)于回溯問題的看法

    摘要:回溯算法在算法過程中就是類似于枚舉算法,嘗試在搜索過程中找到問題的解。 回溯算法( BackTrack )在算法過程中就是類似于枚舉算法,嘗試在搜索過程中找到問題的解。 使用回溯算法解題的一般步驟 使用回溯算法解題的一般步驟: 針對所給問題得出一般的解空間 用回溯搜索方法搜索解空間 使用深度優(yōu)先去搜索所有解并包含適當(dāng)?shù)募糁Σ僮? LeetCode 使用回溯算法的題目主要有 36 題,...

    ASCH 評論0 收藏0
  • LeetCode偶爾一題 —— 39. Combination Sum(回溯算法系列)

    摘要:輸入輸出分析題目由于我們需要找到多個組合,簡單的使用循環(huán)肯定是不行的,這時候我們可以使用回溯算法來解決這個問題。用回溯算法解決問題的一般步驟針對所給問題,定義問題的解空間,它至少包含問題的一個最優(yōu)解。 題目描述 Given a set of candidate numbers (candidates) (without duplicates) and a target number ...

    linkin 評論0 收藏0
  • 基本算法思想:遞歸+分治+動態(tài)規(guī)劃+貪心+回溯+分支限界

    摘要:代碼實現(xiàn)見下面評論對應(yīng)代碼動態(tài)規(guī)劃基本思想和分治法基本思想有共同的地方,不同的是子問題往往不是獨立的,有事母問題要借助子問題的解來判斷,因此把已經(jīng)計算好的問題記錄在表格中,后續(xù)如果需要查詢一下,可以避免重復(fù)計算,這是動態(tài)規(guī)劃的基本思想。 作者:心葉時間:2018-05-01 19:28 本文對應(yīng)github地址:https://github.com/yelloxing/... 以上實現(xiàn)...

    EscapedDog 評論0 收藏0

發(fā)表評論

0條評論

ctriptech

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<