摘要:更多關(guān)于的文章請(qǐng)戳這里您的留言意見是對(duì)我最大的支持我的文章列表
迷宮求解算法一直是算法學(xué)習(xí)的經(jīng)典,實(shí)現(xiàn)自然也是多種多樣,包括動(dòng)態(tài)規(guī)劃,遞歸等實(shí)現(xiàn),這里我們使用窮舉求解,加深對(duì)棧的理解和應(yīng)用
定義Position類用于存儲(chǔ)坐標(biāo)點(diǎn)起點(diǎn)坐標(biāo)為(1,1),終點(diǎn)坐標(biāo)為(8,8)
地圖打印在最下面
class Position { private int px; private int py; public Position(int px, int py) { this.px = px; this.py = py; } public int getPx() { return px; } public void setPx(int px) { this.px = px; } public int getPy() { return py; } public void setPy(int py) { this.py = py; } }這里我們簡(jiǎn)單介紹下move()函數(shù)
move函數(shù)分別向四個(gè)方向移動(dòng),然后將可行的path入棧.
注意,這里棧元素中每個(gè)棧元素Position都是new出來的,棧中存的是reference,
注意看下面這種寫法:
currentPosition.setPy(currentPosition.getPy()+1); stacks.push(currentPosition);
這種寫法一度讓我陷入困惑,因?yàn)閜op出來的Position都是一樣的,原因大家可能應(yīng)該明白了。。。
public void move() { if (moveRight()) { Position temp = new Position(currentPosition.getPx() + 1, currentPosition.getPy()); test.add(temp); stacks.push(temp); } else if (moveBottom()) { Position temp = new Position(currentPosition.getPx(), currentPosition.getPy() + 1); test.add(temp); stacks.push(temp); } else if (moveTop()) { Position temp = new Position(currentPosition.getPx(), currentPosition.getPy() - 1); test.add(temp); stacks.push(temp); } else if (moveLeft()) { Position temp = new Position(currentPosition.getPx() - 1, currentPosition.getPy()); test.add(temp); stacks.push(temp); } else { currentPosition = stacks.pop();//若當(dāng)前位置四個(gè)方向都走不通,則將當(dāng)前位置出棧,繼續(xù)遍歷上一節(jié)點(diǎn) } }整體代碼
class Position { private int px; private int py; public Position(int px, int py) { this.px = px; this.py = py; } public int getPx() { return px; } public void setPx(int px) { this.px = px; } public int getPy() { return py; } public void setPy(int py) { this.py = py; } } public class Maze { private final Position start;//迷宮的起點(diǎn)final private final Position end;//迷宮的終點(diǎn)final private ArrayListfootPrint;//足跡 private ArrayList test; private MyStack stacks;//自定義棧(也可以用java.util中的Stack棧)若想了解MyStack的實(shí)現(xiàn),可以參考我的另一篇博客 private Position currentPosition;//定義當(dāng)前位置 public Maze() {//集合,棧的初始化工作 start = new Position(1, 1); end = new Position(8, 8); currentPosition = start; stacks = new MyStack<>(); test = new ArrayList<>(); } public static final int map[][] = //定義地圖10*10的方格 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 1, 0, 0, 0, 1, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 1, 0, 1}, {1, 0, 0, 0, 0, 1, 1, 0, 0, 1}, {1, 0, 1, 1, 1, 0, 0, 0, 0, 1}, {1, 0, 0, 0, 1, 0, 0, 0, 0, 1}, {1, 0, 1, 0, 0, 0, 1, 0, 0, 1}, {1, 0, 1, 1, 1, 0, 1, 1, 0, 1}, {1, 1, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}; public static void printMap() {//打印地圖 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (map[i][j] == 1) System.out.print(" ■"); else System.out.print(" "); } System.out.println(); } } public boolean moveTop() {//上移 String s = currentPosition.getPx() + "" + (currentPosition.getPy() - 1); if ((map[currentPosition.getPx()][currentPosition.getPy() - 1] != 1) & !isArrived(s)) { footPrint.add(s); return true; } return false; } public boolean moveRight() {//右移 String s = (currentPosition.getPx() + 1) + "" + currentPosition.getPy(); if (map[currentPosition.getPx() + 1][currentPosition.getPy()] != 1 & !isArrived(s)) { footPrint.add(s); return true; } return false; } public boolean moveBottom() {//下移 String s = currentPosition.getPx() + "" + (currentPosition.getPy() + 1); if ((map[currentPosition.getPx()][currentPosition.getPy() + 1] != 1) & !isArrived(s)) { footPrint.add(s); return true; } return false; } public boolean moveLeft() {//左移 String s = (currentPosition.getPx() - 1) + "" + currentPosition.getPy(); if ((map[currentPosition.getPx() - 1][currentPosition.getPy()] != 1) & !isArrived(s)) { footPrint.add(s); return true; } return false; } public boolean isArrived(String position) {//判斷當(dāng)前位置是否已經(jīng)到打過 return footPrint.contains(position); } public void move() {//move函數(shù)分別向四個(gè)方向移動(dòng),然后將可行的path入棧 if (moveRight()) { Position temp = new Position(currentPosition.getPx() + 1, currentPosition.getPy()); test.add(temp); stacks.push(temp); } else if (moveBottom()) { Position temp = new Position(currentPosition.getPx(), currentPosition.getPy() + 1); test.add(temp); stacks.push(temp); } else if (moveTop()) { Position temp = new Position(currentPosition.getPx(), currentPosition.getPy() - 1); test.add(temp); stacks.push(temp); } else if (moveLeft()) { Position temp = new Position(currentPosition.getPx() - 1, currentPosition.getPy()); test.add(temp); stacks.push(temp); } else { currentPosition = stacks.pop();//若當(dāng)前位置四個(gè)方向都走不通,則將當(dāng)前位置出棧,繼續(xù)遍歷上一節(jié)點(diǎn) } } public static void main(String[] args) { Maze m = new Maze(); m.footPrint = new ArrayList<>(); m.footPrint.add("11"); m.stacks.push(m.start); while (m.currentPosition.getPx() != 8 || m.currentPosition.getPy() != 8) { m.move(); } printMap(); System.out.println("下面是足跡,長(zhǎng)度是:" + m.footPrint.size()); m.printFootPrint(); } public void printFootPrint() { for (int i = 0; i < footPrint.size(); i++) { System.out.print(footPrint.get(i) + ","); } System.out.println(); } }
大家可能會(huì)疑惑,為什么足跡是不連續(xù)的(例如:21,12)兩個(gè)位置是走不通的,是因?yàn)樵趐ath遍歷過程中存在跳棧,既當(dāng)前位置走不通便會(huì)將當(dāng)前位置的Position出棧(stacks.pop),然后繼續(xù)上一節(jié)點(diǎn)遍歷。
我的文章列表
Email:sxh13208803520@gmail.com
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/66962.html
摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請(qǐng)注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言迷宮對(duì)于大家都不會(huì)陌生那么迷宮是怎么生成已經(jīng)迷宮要如何找到正確的路徑呢用代碼又怎么實(shí)現(xiàn)帶著這些問題我們繼續(xù)往下看并查集朋友圈有一種算法就做并查集什么意思呢比如現(xiàn)在有零 本人郵箱: 歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明網(wǎng)址 http://blog.csdn.net/tianshi_kcogithub: https://github.c...
摘要:對(duì)應(yīng)迷宮數(shù)組為實(shí)現(xiàn)語言實(shí)現(xiàn)求解方塊類型方塊行號(hào)方塊列號(hào)上一個(gè)方塊在隊(duì)列中位置順序隊(duì)進(jìn)隊(duì)順時(shí)針迷宮路徑如下運(yùn)行結(jié)果應(yīng)用圍住神經(jīng)貓游戲使用寫的項(xiàng)目源碼下載體驗(yàn)最后附上我喜歡的歌的英文翻譯心做 問題 給定一個(gè)M×N的迷宮圖,求一條從指定入口到出口的最短路徑.假設(shè)迷宮圖如圖所示(M=8, N=8) showImg(https://segmentfault.com/img/bVRjIk?w=26...
摘要:這周數(shù)據(jù)結(jié)構(gòu)老師布置了一個(gè)作業(yè),用棧來實(shí)現(xiàn)迷宮的求解,本來是要求自己寫一個(gè)棧的類來實(shí)現(xiàn),但是自己懶得寫了,因?yàn)檫f歸也是棧的一種實(shí)現(xiàn),就直接用了遞歸來寫。 這周數(shù)據(jù)結(jié)構(gòu)老師布置了一個(gè)作業(yè),用棧來實(shí)現(xiàn)迷宮的求解,本來是要求自己寫一個(gè)棧的類來實(shí)現(xiàn),但是自己懶得寫了,因?yàn)檫f歸也是棧的一種實(shí)現(xiàn),就直接用了遞歸來寫。 迷宮求解,主要用的是窮舉法:從起始位置開始,向東南西北四個(gè)方向每個(gè)方向都嘗試走,...
摘要:邊僅由兩個(gè)頂點(diǎn)連接,并且沒有方向的圖稱為無向圖。用分隔符當(dāng)前為空格,也可以是分號(hào)等分隔。深度優(yōu)先算法最簡(jiǎn)搜索起點(diǎn)構(gòu)造函數(shù)找到與起點(diǎn)連通的其他頂點(diǎn)。路徑構(gòu)造函數(shù)接收一個(gè)頂點(diǎn),計(jì)算到與連通的每個(gè)頂點(diǎn)之間的路徑。 Algorithms Fourth EditionWritten By Robert Sedgewick & Kevin WayneTranslated By 謝路云Chapter...
摘要:而且目前大部分編程語言的高級(jí)應(yīng)用都會(huì)用到數(shù)據(jù)結(jié)構(gòu)與算法以及設(shè)計(jì)模式。新添加的或待刪除的元素都保存在棧的同一端,稱作棧頂,另一端就叫棧底。在棧里,新元素都靠近棧頂,舊元素都接近棧底。 前言 JavaScript是當(dāng)下最流行的編程語言之一,它可以做很多事情: 數(shù)據(jù)可視化(D3.js,Three.js,Chart.js); 移動(dòng)端應(yīng)用(React Native,Weex,AppCan,Fl...
閱讀 881·2023-04-26 03:03
閱讀 2206·2021-10-12 10:12
閱讀 1201·2021-09-24 09:48
閱讀 1645·2021-09-22 15:25
閱讀 3332·2021-09-22 15:15
閱讀 914·2019-08-29 16:21
閱讀 1064·2019-08-28 18:00
閱讀 3423·2019-08-26 13:44