【零基礎(chǔ) 快速學(xué)Java】韓順平 零基礎(chǔ)30天學(xué)會Java

P222
class T {
??//使用遞歸回溯的思想來解決老鼠出迷宮
//老韓解讀
//1. findWay 方法就是專門來找出迷宮的路徑
//2. 如果找到,即(6,5)這個位置的值變成了2,就返回 true ,否則返回 false
//?只要最終找到了(6,5),就返回true,然后逐層變true
//3. map 就是二維數(shù)組,即表示迷宮
//4. i,j 就是老鼠的位置,初始化的位置為(1,1)
//5. 因為我們是遞歸的找路,所以我先規(guī)定 map 數(shù)組的各個值的含義
// 0 表示可以走 1 表示障礙物 2 表示可以走 3 表示走過,但是走不通是死路
/* if (map[6][5] == 2) {//說明已經(jīng)找到
??????return true;
????}??的理解
????當(dāng)i=6,j=5時?第一次判斷肯定坐標(biāo)是0,
????于是進入假設(shè),
????注意在判斷(6,5)周圍的路之前已經(jīng)把map[6][5]設(shè)置成2了
????所以(6,5)相鄰的坐標(biāo)一進入方法就會返回true,且不會改變自己的值
????*/???
// 3的理解:在這個方法中,只要你是3,我就不會再從你這里經(jīng)過了???
// 2的含義:你必須從我這個位置過,不是你可以選擇我這個位置,我就是通路???
// true的含義:我這個位置能摸索到(6,5)=2處?,只有我的最終位置即(6,5)=2返回了true,我才是true(我贏了)
// 并不是我這個位置一開始是0,而且我還能往下一個位置走的意思,走不到終點你本身坐標(biāo)就是3,方法就要返回false???
//6. 當(dāng) map[6][5] =2 就說明找到通路,就可以結(jié)束,否則就繼續(xù)找.?
//7. 先確定老鼠找路策略 下->右->上->左
??public boolean findWay(int[][] map, int i, int j) {
????if (map[6][5] == 2) {//說明已經(jīng)找到
??????return true;
????} else {
??????if (map[i][j] == 0) {//當(dāng)前這個位置 0,說明表示可以走
??????//我們假定可以走通
????????map[i][j] = 2;
??????//使用找路策略,來確定該位置是否真的可以走通
??????//下->右->上->左
????????if (findWay(map, i + 1, j)) {//先走下
??????????return true;
????????} else if (findWay(map, i, j + 1)) {//右
??????????return true;
????????} else if (findWay(map, i - 1, j)) {//上
??????????return true;
????????} else if (findWay(map, i, j - 1)) {//左
??????????return true;
????????} else {//走不通的話假設(shè)錯誤,把坐標(biāo)設(shè)置成3,方法返回false
??????????map[i][j] = 3;
??????????return false;
????????}
??????} else { //map[i][j] = 1 , 2, 3
????????//當(dāng)前坐標(biāo)值不是0,就只可能是1,2,3
????????//當(dāng)前是1和3的話,肯定不行
????????//當(dāng)前是2也不行,我走過的路就不再走了,否則可能兜圈子
????????return false;
??????}
????}
??}
}
/*先看(6,5)的坐標(biāo)是不是2
-->(6,5)坐標(biāo)不是2,最開始的時候除了墻其他位置都是0
-->再看當(dāng)前坐標(biāo)是0還是其他
-->坐標(biāo)是0去假設(shè)當(dāng)前位置是2,并且去向各個方向探索求一個返回值
-->探索無果將坐標(biāo)設(shè)為3,返回false
精髓是
找到退出條件:判斷(6,5)的值是否為2?
還有方法的返回值代表什么(代表這個坐標(biāo)能走出去)
找路策略
數(shù)字代表的含義
*/
/*
本來設(shè)想只有一個坐標(biāo)四周全是一是他自己才會是2,但凡他旁邊有一個坐標(biāo)和他一同被封閉,它倆都該是2
想錯了,如果你的路線最終找不到(6,5),你所處方法就會返回false,并把你坐標(biāo)設(shè)為3
只要你經(jīng)過一個坐標(biāo)就會對它進行修改,結(jié)果無非是2或3,
數(shù)組是引用傳遞的,你最后沒走通,但是你對坐標(biāo)的修改都是算數(shù)的
遞歸過程是真真切切的經(jīng)歷了你的每次調(diào)用和賦值,不是假想過程,做出的改變算數(shù)
*/
P367

老師最后寫的有問題,是給newHouse更新id的操作應(yīng)該在往數(shù)組添加newHouse的前面
老師沒寫錯,是你基礎(chǔ)不扎實了,
引用數(shù)據(jù)類型是地址傳遞,不是值傳遞,當(dāng)你在后面修改了newHouse的id,那么就在堆中修改了newHouse對象,此后所有指向這個newHouse的引用所取到的id都更新了。不過我還是感覺給newHouse更新id的操作應(yīng)該在往數(shù)組添加newHouse的前面更符合正常邏輯