注意:为了归纳分类,有些文章的标题中带小括号,小括号里的内容对应于OI Wiki网站中的目录:oi-wiki.org(若小括号中有大于号">“,则表示此文章的内容处于”>"后面的子目录中,或者子目录的子目录中…)
前言
这里只显示最模板的二维网格题型的板子,一维数轴题型也是这个思路,但题目变化多端,没有板子可言,掌握思路原理即可。剪枝请自行根据题目在适当位置操作,本文不过多叙述。
一、BFS大致思路原理(通用板子)
typedef pair<int, int> pii;
void bfs() {
queue<pii> q;
q.push({ , });
/*标记*/
while (!q.empty()) {
int currentx = q.front().first;
int currenty = q.front().second;
q.pop();
/*此处对当前状态进行扩展(新状态为newx,newy)*/
if (/*判断扩展方式所达到的状态是否合法*/) {
q.push({ , });
/*标记*/
}
}
}
二、二维网格题型板子
注意:
如果是多组输入,一定要记得用memset(visited, false, sizeof(visited))
初始化标记数组。
typedef pair<int, int> pii;
int w, h;
char graph[1005][1005];
bool visited[1005][1005];
int startx, starty, targetx, targety; // 起始状态和目标状态的坐标
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
void bfs(int startx, int starty) {
queue<pii> q;
q.push({startx, starty});
visited[startx][starty] = true;
while (!q.empty()) {
int currentx = q.front().first;
int currenty = q.front().second;
q.pop();
// 到达终点状态(最短路径问题一般要用)
if (currentx == targetx && currenty == targety) {
return;
}
for (int i = 0; i < 4; ++i) {
int newx = currentx + dx[i];
int newy = currenty + dy[i];
// 判断扩展方式所达到的状态是否合法(这里只是简单示例,可根据题意添加)
if (newx >= 0 && newx < h && newy >= 0 && newy < w && graph[newx][newy] == '.' && !visited[newx][newy]) {
q.push({newx, newy});
visited[newx][newy] = true;
}
}
}
}
结语
我只是一个A C M预习时长两年半的蒟蒻练习生,喜欢暴力,打表,面向样例编程,请各位键盘侠手下留情。