我記得在遙遠的2023年,我會敲的搜尋也只有暴力列舉了。那個時候的我深搜剛會一丟丟,所以也只配切切水題,然而經常死迴圈re那是肯定的。如今的我因為在多次比賽中都死於搜尋,那就必須得認真磕一下了。
其實是這樣的:我眼裡認為的暴力就真的只是暴力,暴力無非就兩種:列舉打表和模擬。然而在這麼多次比賽後,我總能聽到那些dalao在那邊說,這道題麼暴力可以拿多少多少分。我聽了一臉懵逼。我怎麼就一分都拿不到。這個時候我才如夢初醒,發現他們說的暴力其實都是指深搜。於是我就不得不去學深搜了。
然而,事實上,我發現深搜真的很簡單。
於是,我切了好多題庫第三頁上的搜尋題,有深搜的,也有廣搜的。
我還記得那個時候稚嫩的我連那麼簡單的廣搜都聽不懂,還是涵神講的。我竟然都聽不懂。現在我發現廣搜也就那樣。所以我估計那時候我是因為對佇列的理解不夠深刻導致的。
ok,板子來幾個。
直接深搜:從每乙個非0的數開始搜,如果碰到與它相鄰的非0的數,那就把它變成0。
深搜+回溯:要多開乙個b陣列標記該點是否被訪問過,如果已經訪問過了再去訪問就會死迴圈。#include
using
namespace
std;
int m,n,ans;
char a[110][110];
string s;
inline
int read()
void dfs(int x,int y)
int main()
for (int i=1;i<=m;++i)
for (int j=1;j<=n;++j)
if (a[i][j]!='0')
printf("%d\n",ans);
return
0;}
這道題調了好久,用了好多不同的方法來寫,結果反正就是那些小問題。最近發現我調題都可以調好久,估計又fuzao了。#include
using namespace std;
int n,m,t,sx,sy,fx,fy,x,y,ans;
bool a[10][10],b[10][10];
inline int
read()
void dfs(int
x,int
y) b[x][y]=true;
dfs(x-1,y);
dfs(x+1,y);
dfs(x,y-1);
dfs(x,y+1);
b[x][y]=false;
}int main()
dfs(sx,sy);
printf("%d\n",ans);
return
0;}
bfs八個方向。發現bfs的板子都差不多:首先,該進隊的都進隊。然後,取隊頭,向幾個方向都遍歷一次。如果符合要求,該點進隊,ans陣列更新。當然,這裡也需要開乙個b陣列來儲存當前點是否已經入過隊。#include
using
namespace
std;
int n,ans,a[100],b[100][100];
inline
int read()
void dfs(int x,int y)
return;
}for (int i=1;i<=n;++i)
if (b[x+1][i]==0)
dfs(x+1,i);
for (int j=x+2;j<=n;++j)
}}int main()
#include
using namespace std;
intm,n,m1,m2,a[35][35],sx,sy,fx,fy,ans[35][35];
int dx[10],dy[10];
bool b[35][35];
struct queue
q[1010];
inline int
read()
void bfs()
}}
}int main()
if (a[i][j]==4)
}dx[0]=-m1;dy[0]=-m2;
dx[1]=m1;dy[1]=-m2;
dx[2]=-m1;dy[2]=m2;
dx[3]=m1;dy[3]=m2;
dx[4]=-m2;dy[4]=-m1;
dx[5]=m2;dy[5]=-m1;
dx[6]=-m2;dy[6]=m1;
dx[7]=m2;dy[7]=m1;
bfs();
printf("%d\n",ans[fx][fy]);
return
0;}
廣搜和深搜
一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數 已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著若是...
深搜和廣搜
深度優先搜尋屬於圖演算法的一種,英文縮寫為dfs即depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次 採用的搜尋方法的特點是盡可能先對縱深方向進行搜尋。基本思路 深度優先遍歷圖的方法是,從圖中某頂點v出發 1 訪問頂點v 2 依...
深搜與廣搜
深搜是一種一條路走到黑,碰壁就倒退的演算法。運用遞迴思想,如果到了不符合條件的節點就撤回一步,然後再選擇另一條路走下去。如果這個節點的所有路徑都走完了,再撤回一步。最簡單的模板 int x 4 int y 4 上下左右四個方向走。也可以八個方向,這裡我就不寫了。void dfs int fx,int...