迷宫问题(进阶)CC++

    xiaoxiao2021-03-25  63

    BFS最短路径

    利用广度优先搜索来解决迷宫中的最短路径,需要把队列稍微做下调整,博主用的顺序队列,也可以用链式,链式搜索起来方便些。 之前看到有校友用DFS来解决的,但是相对来说算法复杂度要高些,因为DFS一般用来解决所有路径数目问题。 typedef struct{ MazePos data[10000]; int front, rear; int prior[10000]; }SqQueue; 直接甩代码: #include <iostream> #include <malloc.h> using namespace std; typedef struct{ int x, y; }MazePos; char maze[104][104]; int x, y; typedef struct{ MazePos data[10000]; int front, rear; int prior[10000]; }SqQueue; void InitQueue(SqQueue &Q) { Q.front = Q.rear = -1; } bool EmptyQueue(SqQueue &Q) { if(Q.rear == Q.front) return true; else return false; } void EnQueue(SqQueue &Q, MazePos e) { Q.data[++Q.rear] = e; Q.prior[Q.rear] = Q.front; } void DeQueue(SqQueue &Q, MazePos &e) { if(!EmptyQueue(Q)){ e = Q.data[++Q.front]; } } void BFS(SqQueue &Q, MazePos start, MazePos end, int &flag) { MazePos e, k; EnQueue(Q, start); while(!flag && !EmptyQueue(Q)){ DeQueue(Q, e); if((e.x == end.x) && (e.y == end.y)){ flag = 1; return; } if((e.x + 1) < x && (maze[e.x + 1][e.y] != '#')){ k = e; ++k.x; maze[k.x][k.y] = '#'; EnQueue(Q, k); } if((e.y + 1) < y && (maze[e.x][e.y + 1] != '#')){ k = e; ++k.y; maze[k.x][k.y] = '#'; EnQueue(Q, k); } if((e.x - 1) >= 0 && (maze[e.x - 1][e.y] != '#')){ k = e; --k.x; maze[k.x][k.y] = '#'; EnQueue(Q, k); } if((e.y - 1) >= 0 && (maze[e.x][e.y - 1] != '#')){ k = e; --k.y; maze[k.x][k.y] = '#'; EnQueue(Q, k); } } } int main() { int i, j, n, flag, count, prim; SqQueue q; MazePos start, end; cin>>n; while(n--){ InitQueue(q); flag = 0; count = -1; cin>>x>>y; for(i = 0; i < x; i++){ for(j = 0; j < y; j++) cin>>maze[i][j]; } for(i = 0; i < x; i++) for(j = 0; j < y; j++){ if(maze[i][j] == 'S'){ start.x = i; start.y = j; } if(maze[i][j] == 'E'){ end.x = i; end.y = j; } } BFS(q, start, end, flag); if(flag){ prim = q.front; while(q.prior[prim] != -1){ ++count; prim = q.prior[prim]; } cout<<count + 1<<endl; } else cout<<count<<endl; } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-16347.html

    最新回复(0)