演算法訓練 簡單搜尋

2021-08-15 09:40:01 字數 2233 閱讀 5830

其實這個才是我做 kuangbin 帶你飛專題訓練的第乙個專題,只不過是在做完了 最短路 之後才想起來可以寫個部落格記錄一下。寫完最短路之後,就順便把 簡單搜尋補上了…

簡單搜尋專題,基本上只用到了 dfs 和 bfs,因此以下主要介紹 dfs 和 bfs,然後針對具體的題目給出**。

經典例題 hdu 1241 oil deposits

解題思路:這道題就是用 dfs 遍歷以某乙個標記為 『@』 位置為起點的周圍所有 『@』 標記的區域,遍歷過後將 『@』 標記變為 『#』,』@』 區域的個數就是起點的個數。

#include 

#include

using

namespace

std;

intconst maxn = 110;

int mov[2] = ,,,,,,,};

int m, n;

char grid[maxn][maxn];

void dfs(int , int);

int main()

}printf("%d\n", t);

}return0;}

void dfs(int x, int y)

}

廣度優先搜尋也是搜尋的手段之一,它與深度優先搜尋類似,從某個狀態出發搜尋所有可以到達的狀態。

與深度優先搜尋不同的是搜尋的順序,廣度優先搜尋總是先搜尋距離初始狀態近的狀態。也就是說,他按照 開始狀態 -> 只需一次轉移就可以到達的所有狀態 -> 只需兩次轉移就可以到達的所有狀態 -> …

對於同乙個狀態,廣度優先搜尋之經過一次,因此複雜度為 o(狀態數 × 轉移的方式)。

經典例題 poj 2251 : dungeon master

解題思路:這道題就是用普通的 bfs,只不過是將節點拓展的方式變成了 6 個方向:上、下、東、西、南、北

#include 

#include

#include

#include

#define max_sz 32

#define move 6

using

namespace

std;

struct node;

};int bfs();

char dungeon[max_sz][max_sz][max_sz];

int d[max_sz][max_sz][max_sz];

int dl = ;

int dr = ;

int dc = ;

int l, r, c;

int stat_l, stat_r, stat_c;

int end_l, end_r, end_c;

int main()

if (dungeon[i][j][k] == 'e')

d[i][j][k] = int_max;}}

}int result = bfs();

if (result == 0)

else

printf("escaped in %d minute(s).\n", result);

}return0;}

int bfs()}}

return

0;}

有的題目會要求輸出路徑,這個時候一般需要用乙個結構體陣列來儲存狀態資訊,比如說可以儲存到初始狀態的距離和當前狀態的前乙個狀態。最後再用 dfs 來遍歷一遍這個陣列,將路徑輸出。

經典例題 poj 3984 迷宮問題

#include 

#include

#include

using

namespace

std;

typedef pair p;

struct nodepath[5][5];

int maze[5][5];

int route[2] = , , , };

void dfs(int x, int y)

dfs(path[x][y].px, path[x][y].py);

printf("(%d, %d)\n", x, y);

}void bfs()

}}int main()

memset(path, -1, sizeof(path));

bfs();

return

0;}

演算法筆記 簡單程式設計訓練

codeup 1934 找x 當然也可利用 i n 判斷是否有x存在 includeint main int n,j 1 scanf d n for int i 0 i n i int x scanf d x for int i 0 i n i if j 1 return 0 pat b1036 跟...

演算法訓練 二叉搜尋樹

root根節點 cnt 二叉樹大小 sequence 給定的序列 intinsert int v,int x if v t x val else if t x val v return x 返回根節點,根節點不會再發生變化 void dlr int x,vector int ans void lrd...

模糊搜尋簡單演算法fuzzywuzzy

fuzzywuzzy 是乙個簡單易用的模糊字串匹配工具包。它依據 levenshtein distance 演算法 計算兩個序列之間的差異。該演算法使用levenshtein距離來計算字串之間的相似性。levenshtein distance 演算法,又叫 edit distance 演算法,是指兩...