題目
這是搜尋題中的經典拐彎問題,難點在於怎麼標記已經搜尋過的點。
對於某乙個點來說,從不同路徑但是最後從同乙個方向到達這個點所需的拐彎數可能是不同的。
例如:
5 5s.*t.
.....
.....
.....
.....
同樣向右走到 (1,2)的兩種走法,一種是從右往下,然後再往右,拐了兩次彎;而另一種先向下,然後再往右,
實際上只用拐一次彎,所以在搜尋過程中需要更新更優解而另一種先向下,然後再往右,實際上只用拐一次彎。
所以在搜尋過程中需要更新更優解。
而我們想要求的是是否可以在拐彎盡量少的情況下在兩次拐彎內到達終點。
所以如果從乙個方向到了乙個點,我們需要比較當前的拐彎次數和從這個方向到這個點的最小拐彎次數的大小,如果當前的拐彎次數更少(也就是說當前路徑方案是乙個更優解的話),就將這個之前已經走過的點的此方向的最小拐彎次數更新,並且將這個點的拐彎次數變成更小的拐彎次數,並且放入佇列更新。
然後不斷的更新更優路徑,如果當前的拐彎次數已經大於2了,就換另外乙個點更新,如果能夠在拐彎次數在2之內到達終點,就打標記。
這道題判斷是否拐彎了的方法也很有意思,就是直接判斷當前要走的方向和之前走到這個點的方向是否相同,相同的話就是沒拐彎,否則就是拐彎了,如果是初始點的話就特判一下。
**:(目前只寫明白了bfs的**,dfs的待補):
#include
#define ll long long
#define inf 0x3f3f3f3f
#define endl '\n'
#define ios std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using
namespace std;
const
int n =
1e3+5;
int n, m, f;
char a[n]
[n];
int vis[n]
[n][5]
;struct node
;int dx=
;int dy=
;void
bfs(
int x,
int y)
if(a[xx]
[yy]
=='*'
)continue
;//如果是牆的話就直接跳過。
if(tem >= vis[xx]
[yy]
[i])
continue
;//如果之前此方向上的拐彎次數不大於此時,就跳過
vis[xx]
[yy]
[i]= tem;
//如果此時是更優解的話,更新此方向上的vis陣列
node next;
next.fx = i, next.r = tem, next.x = xx, next.y = yy;
q.push
(next);}
}return;}
intmain()
dfs bfs 細胞問題
原本不想寫這份題解的 因為這道題太簡單啦 orz 但是因為這道題是我唯一乙個既用了dfs又用了bfs而且還儲存著 的題啊 3 吶吶,因為題目不是文字那就只好貼啦 首先是dfs演算法 include dfs include include includeusing namespace std int ...
迷宮問題 dfs bfs
從迷宮入口點 1,1 出發,出口點 m,n 1.求所有路徑條數 2.求最短路徑條數 3.輸出一條最短路徑 題解 向四周搜尋,記下所有一步能到達的座標點 然後依次再從這些點出發,再記下所有一步能到達的座標點,依此類推,直到到達迷宮的出口點 m,n 為止,然後從出口點沿搜尋路徑回溯直至入口。這樣就找到了...
模擬求解迷宮問題(DFS BFS)
迷宮是實驗心理學中乙個古典問題。以乙個n m的長方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。入口在左上方 1,1 處,出口在右下方 n,m 處。要求求出從迷宮入口到出口有無通路的最短路徑。生成迷宮 呼叫的c語言中的srand和rand函式 include include include incl...