日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AT1350 深さ優先探索(洛谷 深度优先搜索+记忆化)

發(fā)布時(shí)間:2023/12/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AT1350 深さ優先探索(洛谷 深度优先搜索+记忆化) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

高橋先生住的小區(qū)是長方形的,被劃分成一個(gè)個(gè)格子。高橋先生想從家里去魚店,高橋先生每次可以走到他前后左右四個(gè)格子中的其中一個(gè),但不能斜著走,也不能走出小區(qū)。
現(xiàn)在給出地圖:
s:代表高橋先生的家
g:代表魚店
.:代表道路
#:代表墻壁
高橋先生不能穿過墻壁。
輸入:第一行輸入n(1<=n<=500),m(1<=m<=500)代表小區(qū)的長和寬,接下來n行每行m個(gè)字符,描述小區(qū)中的每個(gè)格子。
輸出:如果高橋先生能到達(dá)魚店,輸出"Yes",否則輸出"No"。
輸入輸出樣例 輸入 #1
復(fù)制
4 5
s####
…#

#…g 輸出 #1
復(fù)制
No輸入 #2
復(fù)制
4 4
…s


.g… 輸出 #2
復(fù)制
Yes輸入 #3
復(fù)制
10 10
s…
#########.
#…#.
#…####.#.
##…#.#.
#####.#.#.
g.#.#.#.#.
#.#.#.#.#.
###.#.#.#.
#…#… 輸出 #3
復(fù)制
No輸入 #4
復(fù)制
10 10
s…
#########.
#…#.
#…####.#.
##…#.#.
#####.#.#.
g.#.#.#.#.
#.#.#.#.#.
#.#.#.#.#.
#…#… 輸出 #4
復(fù)制
Yes輸入 #5
復(fù)制
1 10
s…####…g 輸出 #5
復(fù)制
No
思路:其實(shí)這道題目是簡單到不能簡單的一道深搜題目。但是我一開始的想法是需要回溯的,但是回溯做的話,是會超時(shí)的。如果當(dāng)前狀態(tài)走過了,但是無法走到終點(diǎn),按照之前的做法就取消標(biāo)記,然后下次從別的點(diǎn)走到這個(gè)點(diǎn)的時(shí)候,結(jié)果仍然是走不到。那么我們就不取消標(biāo)記了,如果某一個(gè)狀態(tài)可以直接走到終點(diǎn),就直接返回,如果走不到終點(diǎn),仍然不取消標(biāo)記,別的點(diǎn)走到這一個(gè)點(diǎn)的時(shí)候,就會知道這個(gè)點(diǎn)無法走到終點(diǎn)。這一操作類似于記憶化的操作。
代碼如下:

#include <iostream> #include <string> using namespace std; int n,m; int dir[4][2] = {{-1,0},{0,-1},{1,0},{0,1}}; //定義方向數(shù)組 ; string maze[1100]; //定義地圖; bool vis[1100][1100]; //定義標(biāo)記數(shù)組, 記錄當(dāng)前點(diǎn)是否走過; bool in(int x,int y) {return x >= 0 && x < n && y >= 0 && y < m; } // 判斷函數(shù),判斷當(dāng)前點(diǎn)是否位于地圖內(nèi); bool dfs(int x,int y) {if (maze[x][y] == 'g') {return true;} //判斷是否到達(dá);; vis[x][y] = 1; //標(biāo)記當(dāng)前點(diǎn); for (int i = 0; i < 4; i++) { // 向四個(gè)方向搜索; int tx = x + dir[i][0];int ty = y + dir[i][1];if (in(tx,ty) && maze[tx][ty] != '#' && !vis[tx][ty]) { //在地圖內(nèi)、不是障礙物、未訪問則可繼續(xù)搜索; if (dfs(tx,ty)) {return true; // 在(tx,ty)能到達(dá),在(x,y)也能到達(dá); }}}//若刪除標(biāo)記,則從其他點(diǎn)也可搜索至(x,y); //從(x,y)無法到達(dá)終點(diǎn),則從其他點(diǎn)到達(dá)(x,y)之后也無法到達(dá)終點(diǎn); //故無需回溯; return false; } int main () {cin >> n >> m;for (int i = 0; i < n; i++) {cin >> maze[i];} // 輸入地圖; int x,y;for (int i = 0; i < n; i++) { // 尋找起點(diǎn); for (int j = 0; j < m; j++) {if (maze[i][j] == 's') {x = i, y = j;}}}if (dfs(x,y)) {cout << "Yes";} else {cout << "No";}return 0; }

ps:本題用bfs做更好。努力加油a啊

總結(jié)

以上是生活随笔為你收集整理的AT1350 深さ優先探索(洛谷 深度优先搜索+记忆化)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。