bfs和dfs板子
- 过了一个月,bfs和dfs复习,手打一遍板子。。。
BFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #include<bits/stdc++.h> using namespace std; typedef long long ll; bool vis[...]; int dir[...][...] = {...};
struct node{ int x,y,...; int step; };
void bfs(有必要的情况下需要传参){ queue <node> q; start.step = 0; ... q.push(start); ... while(!q.empty()){ node q1 = q.front(); q.pop(); if(q1.某状态(通常是step)==目标状态){ 处理或不处理; return; } node v; for(int i=0;i<...;i++){ int dx = q1.x + dir[...][0]; int dy = q1.y +dir[...][1]; ...; if(不满足条件) continue; vis[...] = 1; v.step = q1.step + 1; v.x = dx, v.y = dy; 对答案做处理 q.push(v); } } }
int main(){ 处理输入; bfs(参数); 处理输出; return 0; }
|
DFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #include<bits/stdc++.h> using namespace std; typedef long long ll; bool vis[...]; int dir[...][...] = {...}; bool f = false;
void dfs(参数){ if(f){ return ...; } if(达到目标状态){ 处理答案; f = true; return ...; } for(遍历所有状态){ if(合法&&!vis[...]){ vis[...] = 1; 处理; dfs(传参); 回溯(如果需要的话); } } return ...; }
int main(){ 处理输入; 处理过程; dfs(传参); 处理输出; return 0; }
|