迷宮回溯問題分析和實現

原文鏈接:傳送門

迷宮問題

img

說明:

  • 小球得到的路徑,和程序員設置的找路策略有關即:找路的上下左右的順序相關
  • 再得到小球路徑時,可以先使用(下右上左),再改成(上右下左),看看路徑是不是有變化
  • 測試回溯現象
  • 思考: 如何求出最短路徑?
 //下面代碼的找路策略是:下右上左
public static boolean setWay(int[][] map, int i, int j) {if (map[6][5] == 2) { // 表示路已經找到了return true;} else {if (map[i][j] == 0) { // 0: 可以走還沒有走// 這里開始遞歸回溯map[i][j] = 2; // 認為該點是可以走通,但是不一定if (setWay(map, i + 1, j)) { // 下找return true;} else if (setWay(map, i, j + 1)) { // 右return true;} else if (setWay(map, i - 1, j)) { // 上return true;} else if (setWay(map, i, j - 1)) { // 左return true;} else {// 走不通map[i][j] = 3;return false;}} else { //如果map(i)(j)!=0 //則值 1,2,3return false;}
}}
int[][] map = new int[8][7];
//上下全部置1
for(int i = 0 ; i<7;i++){map[0][i] = 1;map[7][i] = 1;
}
//左右全部置1
for (int i = 0; i< 8; i++) {map[i][0] = 1;map[i][6] = 1;
}

完整代碼

package com.atguigu.recursion;/*** ClassName:  <br/>* Description:  <br/>* Date: 2021-02-22 9:50 <br/>* @project data_algorithm* @package com.atguigu.recursion*/
public class MiGong {public static void main(String[] args) {// 先創建一個二維數組,模擬迷宮// 地圖int[][] map = new int[8][7];// 使用1 表示墻// 上下全部置為1for (int i = 0; i < 7; i++) {map[0][i] = 1;map[7][i] = 1;}// 左右全部置為1for (int i = 0; i < 8; i++) {map[i][0] = 1;map[i][6] = 1;}//設置擋板, 1 表示map[3][1] = 1;map[3][2] = 1;
//        map[1][2] = 1;
//        map[2][2] = 1;// 輸出地圖System.out.println("地圖的情況");for (int i = 0; i < 8; i++) {for (int j = 0; j < 7; j++) {System.out.print(map[i][j] + " ");}System.out.println();}//使用遞歸回溯給小球找路//setWay(map, 1, 1);setWay2(map, 1, 1);//輸出新的地圖, 小球走過,并標識過的遞歸System.out.println("小球走過,并標識過的 地圖的情況");for (int i = 0; i < 8; i++) {for (int j = 0; j < 7; j++) {System.out.print(map[i][j] + " ");}System.out.println();}}//使用遞歸回溯來給小球找路//說明//1. map 表示地圖//2. i,j 表示從地圖的哪個位置開始出發 (1,1)//3. 如果小球能到 map[6][5] 位置,則說明通路找到.//4. 約定: 當map[i][j] 為 0 表示該點沒有走過 當為 1 表示墻  ; 2 表示通路可以走 ; 3 表示該點已經走過,但是走不通//5. 在走迷宮時,需要確定一個策略(方法) 下->右->上->左 , 如果該點走不通,再回溯/*** * @param map 表示地圖* @param i 從哪個位置開始找* @param j * @return 如果找到通路,就返回true, 否則返回false*/public static boolean setWay(int[][] map, int i, int j) {if(map[6][5] == 2) { // 通路已經找到okreturn true;} else {if(map[i][j] == 0) { //如果當前這個點還沒有走過//按照策略 下->右->上->左  走map[i][j] = 2; // 假定該點是可以走通.if(setWay(map, i+1, j)) {//向下走return true;} else if (setWay(map, i, j+1)) { //向右走return true;} else if (setWay(map, i-1, j)) { //向上return true;} else if (setWay(map, i, j-1)){ // 向左走return true;} else {//說明該點是走不通,是死路map[i][j] = 3;return false;}} else { // 如果map[i][j] != 0 , 可能是 1, 2, 3return false;}}}//修改找路的策略,改成 上->右->下->左public static boolean setWay2(int[][] map, int i, int j) {if(map[6][5] == 2) { // 通路已經找到okreturn true;} else {if(map[i][j] == 0) { //如果當前這個點還沒有走過//按照策略 上->右->下->左map[i][j] = 2; // 假定該點是可以走通.if(setWay2(map, i-1, j)) {//向上走return true;} else if (setWay2(map, i, j+1)) { //向右走return true;} else if (setWay2(map, i+1, j)) { //向下return true;} else if (setWay2(map, i, j-1)){ // 向左走return true;} else {//說明該點是走不通,是死路map[i][j] = 3;return false;}} else { // 如果map[i][j] != 0 , 可能是 1, 2, 3return false;}}}}

運行結果

地圖的情況
1 1 1 1 1 1 1 
1 0 0 0 0 0 1 
1 0 0 0 0 0 1 
1 1 1 0 0 0 1 
1 0 0 0 0 0 1 
1 0 0 0 0 0 1 
1 0 0 0 0 0 1 
1 1 1 1 1 1 1 
小球走過,并標識過的 地圖的情況
1 1 1 1 1 1 1 
1 2 2 2 2 2 1 
1 0 0 0 0 2 1 
1 1 1 0 0 2 1 
1 0 0 0 0 2 1 
1 0 0 0 0 2 1 
1 0 0 0 0 2 1 
1 1 1 1 1 1 1 Process finished with exit code 0

通過遞歸,遍歷所有方式的路徑,共享棋盤中的數組位置數據

實現查找最優解

策略:下->右->上->左

最后噼里啪啦的回去了

回溯

原文鏈接:傳送門

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

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

相關文章

canvas clear 指定屬性的元素_好程序員web前端分享CSS屬性組成及作用

好程序員web前端分享CSS屬性組成及作用學習目標1、css屬性和屬性值的定義2、css文本屬性3、css列表屬性4、css背景屬性5、css邊框屬性6、css浮動屬性一、css屬性和屬性值的定義屬性&#xff1a;屬性是指定選擇符所具有的屬性&#xff0c;它是css的核心&#xff0c;css2共有150多…

mybatis大于小于等于

大于&#xff1a;<![CDATA[>]]> 小于&#xff1a;<![CDATA[<]]> 等于&#xff1a;<![CDATA[]]> 大于等于&#xff1a;<![CDATA[>]]> 小于等于&#xff1a;<![CDATA[<]]>轉載于:https://www.cnblogs.com/YuanFan123/p/7234530.html

2017年秋招-廣聯達面試及思考

面試官提問&#xff1a; 自我介紹&#xff08;沒有做充分的準備&#xff0c;總感覺說的不好&#xff09;為什么選擇做前端&#xff1f;在前端方向&#xff0c;你認為自身有哪些優點&#xff1f;前端需要掌握哪些技術知識點&#xff1f;看過哪些比較好的網站&#xff1f;會不會使…

排序算法介紹和分類

原文鏈接:傳送門 排序算法的介紹 排序也成排序算法 排序也稱排序算法(Sort Algorithm)&#xff0c;排序是將一組數據&#xff0c;依指定的順序進行排列的過程。 排序的分類&#xff1a; 1) 內部排序: 指將需要處理的所有數據都加載到**內部存儲器(內存)**中進行排序。 2) 外…

認識高清視頻編碼(MPEG、H.264、WMV-HD、RMVB)

文章出處&#xff1a;www.net1980.com 原創 最近兩年&#xff0c;“高清”這個詞語非常火熱&#xff0c;已經成為家電和IT行業的最新潮流了。高清視頻和普通視頻有什么區別呢&#xff1f;主要是分辨率上的區別&#xff0c;720P視頻的分辨率為1280X720&#xff0c;1080P視頻的分…

解讀SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC

SPP與SPPF 一、SPP的應用的背景 在卷積神經網絡中我們經常看到固定輸入的設計&#xff0c;但是如果我們輸入的不能是固定尺寸的該怎么辦呢&#xff1f; 通常來說&#xff0c;我們有以下幾種方法&#xff1a; &#xff08;1&#xff09;對輸入進行resize操作&#xff0c;讓他們…

go mongodb排序查詢_《MongoDB》day two

Mongodb的更新方式有&#xff1f;db.集合名.update() 函數:用于更新已存在的文檔。語法格式&#xff1a;db.COLLECTION_NAME.update({查詢條件},{更新內容},{更新參數(可選)}) 注&#xff1a;這種方式會覆蓋原有的文檔。使用更新操作符 使用 save()函數更新文檔 Mongodb的updat…

【轉】 JMeter學習(二十四)linux啟動jmeter,執行./jmeter.sh報錯解決方法

1.l-bash: ./jmeter.sh: Permission denied解決辦法&#xff1a;jmeter.sh的執行權限改改&#xff0c;是權限不夠chmod 777 jmeter.sh2.An error occurred:No X11 DISPLAY variable was set, but this program performed an operation which requires it.步驟一&#xff1a;Lin…

哈希表思路圖解和代碼實現

原文鏈接傳送門 哈希表(散列)-Google上機題 看一個實際需求&#xff0c;google公司的一個上機題: 有一個公司,當有新的員工來報道時,要求將該員工的信息加入(id,性別,年齡,住址…),當輸入該員工的id時,要求查找到該員工的 所有信息. 要求: 不使用數據庫,盡量節省內存,速度越…

android開發學習——Mina框架

Apache Mina Server 是一個網絡通信應用框架&#xff0c;對socket進行了封裝。 http://www.cnblogs.com/moonandstar08/p/5475766.html http://blog.csdn.net/u010739551/article/details/47361365 http://www.cnblogs.com/yanghuiping/p/4108063.html &#xff08;mina 自定…

glibc交叉編譯_TSN之linuxptp交叉編譯

0 開發環境1 linuxptp是什么2 為什么要交叉編譯linuxptp3 修改makefile4 修改源碼5 交叉編譯0 開發環境筆記本&#xff1a;ubuntu18.04.5&#xff0c;內核版本為5.3 開發板&#xff1a;imx8mp-evk內核版本&#xff1a;Linux5.4.24交叉編譯工具鏈&#xff1a;fsl-imx-xwayland-g…

230. Kth Smallest Element in a BST

題目&#xff1a; Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Note: You may assume k is always valid, 1 ≤ k ≤ BSTs total elements. Follow up:What if the BST is modified (insert/delete operations) often …

聲音編碼

1.脈沖編碼調制PCM文件格式簡介 將音頻數字化&#xff0c;其實就是將聲音數字化。最常見的方式是透過脈沖編碼調制PCM(Pulse Code Modulation) 。運作原理如下。首先我們考慮聲音經過麥克風&#xff0c;轉換成一連串電壓變化的信號&#xff0c;如圖一所示。這張圖的橫座標為秒&…

Elastic Stack簡介

Elastic Stack簡介 如果你沒有聽說過Elastic Stack&#xff0c;那你一定聽說過ELK&#xff0c;實際上ELK是三款軟件的簡稱&#xff0c;分別是Elasticsearch、 Logstash、Kibana組成&#xff0c;在發展的過程中&#xff0c;又有新成員Beats的加入&#xff0c;所以就形成了Elast…

webpack v3 結合 react-router v4 做 dynamic import — 按需加載(懶加載)

為什么要做dynamic import&#xff1f; dynamic import不知道為什么有很多叫法&#xff0c;什么按需加載&#xff0c;懶加載&#xff0c;Code Splitting&#xff0c;代碼分頁等。總之&#xff0c;就是在SPA&#xff0c;把JS代碼分成N個頁面份數的文件&#xff0c;不在用戶剛進來…

go kegg_工具篇丨GO和KEGG富集不到通路?快試試這個超贊的功能分析工具吧

GO和KEGG富集分析是我們在篩選出差異表達基因之后&#xff0c;都會去做的套路性分析。然鵝……我相信&#xff0c;總有那么一些“倒霉孩子”會遇到跟我一樣的窘境吧&#xff0c;好不容易篩選出來的差異基因&#xff0c;嘗試了DAVID(https://david.ncifcrf.gov/)、Metascape(htt…

大齡程序員的未來在何方

來源&#xff1a;http://www.gad.qq.com//article/detail/30358?sessionUserTypeBFT.PARAMS.229862.TASKID&ADUIN114328649&ADSESSION1501026740&ADTAGCLIENT.QQ.5533_.0&ADPUBNO26719 作者&#xff1a;foruok 大家都對大齡技術人員的未來非常關心&#xff0c…

搭建Telnet服務器

搭建Telnet服務器 作者&#xff1a;尹正杰 版權聲明&#xff1a;原創作品&#xff0c;謝絕轉載&#xff01;否則將追究法律責任。 可能大家都知道現在已經很少有人用TELNET服務器&#xff0c; 因為它傳輸數據是以明文的方式&#xff0c;我們很容易通過抓包軟件講數據進行抓包&a…

table取tr對象 vue_Vue筆記

Vue集成了React和Angular的優點&#xff0c;摒棄了他們的缺點。Vue的官網&#xff1a;https://cn.vuejs.org/v2/api/Vue誕生于2016年&#xff0c;是現在非常流行的MVVM框架。Vue提供了“引包”的使用方法&#xff0c;初學者可以在這之下學習語法。不需要webpack&#xff0c;不需…

Beats入門簡介

使用Beat收集nginx日志和指標數據 項目需求 Nginx是一款非常優秀的web服務器&#xff0c;往往nginx服務會作為項目的訪問入口&#xff0c;那么&#xff0c;nginx的性能保障就變得非常重要了&#xff0c;如果nginx的運行出現了問題就會對項目有較大的影響&#xff0c;所以&…