今天學習乙個關於棧的經典問題—迷宮問題!
這個問題我們分別用棧和遞迴兩種方法分別來實現一下
還有就是我們分別考慮幾種情況去實現和改進優化
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檢視名,而是要返回...