在0x21节中,我们介绍了图的广度优先遍历,在0x22节中,我们又定义了深度优先搜索过程产生的“搜索树”结构。如果我们把问题状态空间类比成一张图,那么广度优先搜索就相当于对这张图的广度优先遍历。类似地,我们依然借助一个队列来实现广度优先搜索,起初,队列中仅包含起始状态。在广度优先搜索的过程中,我们不断从队头取出状态,对于该状态面临的所有分支,把沿着每条分支到达的下一个状态(如果尚未访问过或者能够被更新成更优的解)插入队尾。重复执行上述过程直到队列为空。
题意 :

思路 :
#include
#include
#include
using namespace std;
const int N = 510;
struct State {
int x, y, lie;
};
int n, m;
char g[N][N];
int dist[N][N][3];
bool check(int x, int y) {
if (x < 0 || x >= n || y < 0 || y >= m) return false;
return g[x][y] != '#';
}
int bfs(State start, State end) {
queue<State> que;
que.push(start);
dist[start.x][start.y][start.lie] = 0;
int d[3][4][3] = {
{{0, -2, 1}, {0, 1, 1}, {-2, 0, 2}, {1, 0, 2}},
{{0, -1, 0}, {0, 2, 0}, {-1, 0, 1}, {1, 0, 1}},
{{0, -1, 2}, {0, 1, 2}, {-1, 0, 0}, {2, 0, 0}}
};
while (que.size()) {
auto t = que.front(); que.pop();
for (int i = 0; i < 4; ++ i) {
State next = {t.x + d[t.lie][i][0], t.y + d[t.lie][i][1], d[t.lie][i][2]};
int x = next.x, y = next.y, lie = next.lie;
if (!check(x, y)) continue;
if (lie == 0) {
if (g[x][y] == 'E') continue;
} else if (lie == 1) {
if (!check(x, y + 1)) continue;
} else {
if (!check(x + 1, y)) continue;
}
if (dist[x][y][lie] == -1) {
dist[x][y][lie] = dist[t.x][t.y][t.lie] + 1;
que.push(next);
}
}
}
return dist[end.x][end.y][end.lie];
}
int main() {
while (scanf("%d%d", &n, &m), n || m) {
for (int i = 0; i < n; ++ i) scanf("%s", g[i]);
memset(dist, -1, sizeof dist);
State start = {-1}, end;
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < m; ++ j) {
if (g[i][j] == 'X' && start.x == -1) {
if (g[i + 1][j] == 'X') start = {i, j, 2};
else if (g[i][j + 1] == 'X') start = {i, j, 1};
else start = {i, j, 0};
}
else if (g[i][j] == 'O') end = {i, j, 0};
}
}
int ans = bfs(start, end);
if (ans == -1) cout << "Impossible" << endl;
else cout << ans << endl;
}
}
题意 :

思路 :

#include
#include
using namespace std;
typedef pair<int, int> PII;
const int N = 1e3 + 10;
int n, m;
char g[N][N];
int dist[N][N];
PII q[N * N];
void bfs() {
memset(dist, -1, sizeof dist);
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
int hh = 0, tt = -1;
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < m; ++ j) {
if (g[i][j] == '1') {
q[ ++ tt] = {i, j};
dist[i][j] = 0;
}
}
}
while (hh <= tt) {
PII t = q[hh ++ ];
for (int i = 0; i < 4; ++ i) {
int x = t.first + dx[i], y = t.second + dy[i];
if (x < 0 || x >= n || y < 0 || y >= m) continue;
if (dist[x][y] != -1) continue;
dist[x][y] = dist[t.first][t.second] + 1;
q[ ++ tt] = {x, y};
}
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; ++ i) scanf("%s", g[i]);
bfs();
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < m; ++ j) {
printf("%d ", dist[i][j]);
}
puts("");
}
}