有一个迷宫,需要先在左转或右转为优先选择的情况下,利用深度优先搜索分别找一条路径,可返回。然后是用宽度优先搜索找最短路,不可返回。 #include <iostream> #include <cstdio> #include <cstring> #include <queue>; using namespace std; typedef struct { int x, y; int depth; } node_t; node_t node[1601]; //用于bfs找最短路的,很明显 char s[41][41]; //记录图 int row, col, cnt; int sx, sy, ex, ey; //起点,终点坐标 // 向下,右,上,左为0,1,2,3 int fl[4] = {1, 0, 3, 2}; //其实就是+1,+0,-1,-2 int fr[4] = {3, 0, 1, 2}; //-1, 0, +1, -2 int fx[4] = {0, 1, 0, -1}; int fy[4] = {1, 0, -1, 0}; void dfs(int d, int x, int y, char dir) { if (x == ex && y == ey) { cout << cnt << ' '; return; //找到就跳出 } ++cnt; //先把肯定可走的一点加起来 int nx, ny, nd; if (dir == 'l') { for (int i = 0; i < 4; ++i) { nd = (d+fl[i]) % 4; nx = x + fx[nd]; ny = y + fy[nd]; if (nx >=0 && nx < col && ny >= 0 && ny < row && s[ny][nx] != '#') { dfs(nd, nx, ny, 'l'); return; //找到一个dfs继续下去后,之前的可以return了 } } } else if (dir == 'r') { for (int i = 0; i < 4; ++i) { nd = (d+fr[i]) % 4; nx = x + fx[nd]; ny = y + fy[nd]; if (nx >=0 && nx < col && ny >= 0 && ny < row && s[ny][nx] != '#') { dfs(nd, nx, ny, 'r'); //可以返回,左或右优先,走过的路不是最短路 return; //找到一个dfs继续下去,实在不行返回前一点,这里没用visit } } } } void bfs(int x, int y) { int nx, ny, ndepth; bool vist[41][41]; memset(vist, 0, sizeof(vist)); vist[y][x] = true; queue<node_t> q; node_t node; node.x = x; node.y = y; node.depth = 1; q.push(node); while (!q.empty()) { node = q.front(); q.pop(); x = node.x; y = node.y; ndepth = node.depth; for (int i = 0; i < 4; ++i) { nx = x + fx[i]; ny = y + fy[i]; if (nx >= 0 && nx < col && ny >= 0 && ny < row && vist[ny][nx] == false && s[ny][nx] != '#') { if (nx == ex && ny == ey) { cout << ndepth+1 << endl; return; } vist[ny][nx] = true; node.x = nx; node.y = ny; node.depth = ndepth + 1; q.push(node); } } } } int main() { //freopen("temp.txt", "r", stdin); int cases, d; //d面向 cin >> cases; while (cases--) { cin >> col >> row; for (int i = 0; i < row; ++i) { cin >> s[i]; for (int j = 0; j < col; ++j) { if (s[i][j] == 'S') { sx = j; sy = i; } else if (s[i][j] == 'E') { ex = j; ey = i; } } } if (sy == 0) d = 0; if (sy == row-1) d = 2; if (sx == 0) d = 1; if (sx == col-1) d = 3; cnt = 1; //包含'S' dfs(d, sx, sy, 'l'); cnt = 1; dfs(d, sx, sy, 'r'); bfs(sx, sy); } return 0; }