迷宮問題 菜鳥學習日記

2021-08-13 20:37:01 字數 3154 閱讀 7998

今天學習乙個關於棧的經典問題—迷宮問題

這個問題我們分別用遞迴兩種方法分別來實現一下

還有就是我們分別考慮幾種情況去實現和改進優化

1、如果有多條通路

2、找最短路徑

3、帶環的路徑

關於問題沒有什麼可多描述的,就是迷宮,找通路

寫迷宮,當然要先有迷宮呀!

先寫個迷宮地圖

templateclass maze//maze(迷宮)

}}*/

//方法二:

maze(int* maze)}}

...protected:

int _maze[n][n];

};void test()

, ,,,

,,,,

,,};maze<10> mz((int*)maze);//將陣列傳過去

...}

列印出來看看

好了,地圖出來了,就要開始走了,找通路

0為路,1為牆

入口點為(1,0)

這裡我們每個點是乙個二維座標,有行和列,所以設定乙個結構體變數來放座標點

struct pos

那我們來考慮一下通路的條件吧

首先我們要檢查一下我們下乙個走的點,

1、為0,是通路

2、不能超出邊界

bool checkaccess(pos pos)//邊界檢查+點是否合格

return false;

}

接下來該走了,走過的路,標為2

bool getpath(pos entry)

//沒有到出口,合法的點

//探測(上下左右)

pos next = cur;

//上next._row -= 1;

if (checkaccess(next))

//下next = cur;

next._row += 1;

if (checkaccess(next))

//左next = cur;

next._col -= 1;

if (checkaccess(next))

//右next = cur;

這是最簡單的一種,但當迷宮如果有兩條通路時,就不行了,而且也無法記錄我們走過的路徑

所以要進行改進,我們用棧來解決這個問題

首先我們先把入口點壓入棧中,然後我們去探測周圍的點,某乙個有通路就走,沒有通路,就出棧,返回上乙個點,探測其它方向,一直這樣迴圈,知道出棧空,退回到入口處,把所有通路就都走了一遍

void getpath(pos entry, stack& path)

//下next = cur;

next._row += 1;

if (checkaccess(next))

//左next = cur;

next._col -= 1;

if (checkaccess(next))

//右next = cur;

next._col += 1;

if (checkaccess(next))

//回溯

來面我用遞迴實現

遞迴實現

遞迴實現有乙個特點,就是遞迴本身的特性,可以實現天然的回溯,棧是pop點回溯,而遞迴本身就可以回溯,當探測周圍沒有通路,就返回上一級呼叫,天然回溯到上乙個點

//遞迴寫法(天然回溯)

bool getpath(pos entry, stack

& path)

}//下

next = cur;

next._row += 1;

if (checkaccess(next))

}//左

next = cur;

next._col -= 1;

if (checkaccess(next))

}//右

next = cur;

next._col += 1;

if (checkaccess(next))

}//回溯

return

false;//返回上一層呼叫,天然回溯}}

結果和上面一樣,走的過程也一樣,只是回溯的原理不太一樣而已

帶環迷宮

bool getpathr(pos entry, stack& path)//(path 路徑)//用庫里的棧

}//下

next = cur;

next._row += 1;

if (checkaccess(cur, next))

}//左

next = cur;

next._col -= 1;

if (checkaccess(cur, next))

}//右

next = cur;

next._col += 1;

if (checkaccess(cur, next))

}//回溯

return

false;//返回上一層呼叫}}

Java菜鳥學習日記16

直接使用jsbc開發的問題 當表中的列很多時,需要寫很長的sql語句,還需要寫大量的引數設定語句 set 讀取資料時,還需寫大量的設定屬性語句 set 易錯且不易修改,如某個字段需要去掉,就需要調整後續的很多序號 大量的時間都花在了 搬磚 上 而且很容易埋下bug,後期測試和修復時間大大增加 結論 ...

Java菜鳥學習日記30

bootstrap 響應式按鈕 表現效果 手機上全寬,桌面上2列寬 原理 btn block 會將按鈕變成全寬,但桌面上 col sm 2 生效,按鈕被限制在2列寬中,手機上col sm 2失效 在自己的專案中整合第三方外掛程式或功能 找到所有的依賴項 css js jar 配置檔案 並且注意依賴項...

Java菜鳥學習日記33

使用git分支開發新特性或修復bug 每個分支都有自己的歷史記錄 除了使用eclipse工具建立切換分支之外,也可以使用命令方式建立及切換分支 使用 responsebody和jackson返回json資料 返回json資料時,控制器返回的不是modelandview或string檢視名,而是要返回...