dfs(初學者版本)

2021-10-11 21:55:06 字數 3529 閱讀 2724

dfs的特點是先去找結束的條件,在未結束的前提下進行再一次的搜尋。

「s」是起點,「d」是終點,「」是障礙物,「.」是可以走的路

5 6…s

.*….….

.**.

.d…

初學所寫的未經過優化的**
#include

using

namespace std;

bool vis[

100]

[100];

char gra[

100]

[100];

int m, n;

//m行n列

intin

(int x,

int y)

bool

dfs(

int x,

int y)

tx = x, ty = y -1;

if(in(tx, ty)

&& gra[tx]

[ty]

!='*'

&&!vis[tx]

[ty]

) tx = x +

1, ty = y;if(

in(tx, ty)

&& gra[tx]

[ty]

!='*'

&&!vis[tx]

[ty]

) tx = x, ty = y +1;

if(in(tx, ty)

&& gra[tx]

[ty]

!='*'

&&!vis[tx]

[ty]

) vis[x]

[y]=0;

gra[x]

[y]=

'.';

return

false;}

intmain()

for(

int i =

0; i < m; i++)if

(dfs

(x, y)

) cout << endl;}}

else cout <<

"no"

<< endl;

return0;

}

因為該**有太多重複的片段,所以我們可以用方向向量進行優化。

#include

using

namespace std;

bool vis[

100]

[100];

char gra[

100]

[100];

int m, n;

//m行n列

int dir[4]

[2]=

,,,}

;intin(

int x,

int y)

bool

dfs(

int x,

int y)

} vis[x]

[y]=0;

gra[x]

[y]=

'.';

return

false;}

intmain()

for(

int i =

0; i < m; i++

)//尋找起點if(

dfs(x, y)

)//開始搜尋

cout << endl;}}

else cout <<

"no"

<< endl;

return0;

}

jxj去參觀了乙個迷宮,迷宮裡有nn個通道:

1."+「上下左右四個方向均可以通過

2.」-「僅左右兩個方向可以通過

3.」|"僅上下兩個方向可以通過

迷宮的入口在左上角,現在jxj在打算走一遍這個迷宮,由於他知道迷宮的出口在右下角,所以愛鑽牛角尖的jxj只打算走右和下兩個方向,但是他又很懶,如果他無法走出迷宮,他將原路返回並放棄走迷宮,所以他現在急需知道是否能走出迷宮,你能幫他算一下嗎?

輸入格式:

多個樣例,最多20個樣例,每個樣例第一行輸入乙個整數n(1n,第二行到第n+1行,每行n個字元,表示迷宮的通道。

輸出格式:

每行輸出"yes"或"no",如果能走出迷宮輸出"yes",不能走出迷宮就輸出"no"。

輸入樣例:2+|

-+2-+|+

輸出樣例:

noyes

hint

樣例解析:第乙個樣例』+『不能向右到』|』,也不能向下到』-』,第二個樣例可由』-『向右到』+』,再向下到』+』

#include

using

namespace std;

char gra[12]

[12];

int n;

intin

(int x,

int y)

bool

dfs(

int x,

int y)

intmain()

return0;

}

這裡簡稱跳馬問題

「#」是障礙物,「s」是起點,「t」是終點,「.」是可以走的路

/*

10 9 //以下是可以使用的地圖

.#....#s#

..#.#.#..

..##.#..#

......##.

...t.....

...#.#...

...#.....

...###...

.........

.##......*/

#include

using

namespace std;

bool vis[

100]

[100];

int dir[8]

[2]=

,,,,

,,,}

;char gra[

100]

[100];

int m, n;

intin

(int x,

int y)

bool

dfs(

int x,

int y)

} vis[x]

[y]=0;

gra[x]

[y]=

'.';

return

false;}

intmain()

for(

int i =

0; i < m; i++)if

(dfs

(x, y)

) cout << endl;

} cout <<

"yes";}

else cout <<

"no"

<< endl;

return0;

}

初學者談初學者學html

這是乙個段落。解釋一下就是 html 與 html 之間的文字是描述網頁。head 與 head 之間的文字是文件的元資料。title 與 之間的文字是文件的標題。body 與 body 之間的文字是可見的頁面內容,是文章的主體部分。h1 與 h1 之間的文字被顯示為乙個大標題。p 與 p 之間的文...

初學者mysql MySQL初學者使用指南

有很多朋友雖然安裝好了mysql但卻不知如何使用它。在這篇文章中我們就從連線mysql 修改密碼 增加使用者等方面來學習一些mysql的常用命令。一 連線mysql。1 例1 連線到本機上的mysql。首先在開啟dos視窗,然後進入目錄 mysqlbin,再鍵入命令mysql uroot p,回車後...

初學者 遞迴

program xuexi3 implicit none integer,external fact 呼叫函式需要寫external 待定 integer n write n read n write fact n stop endrecursive integer function fact n ...