定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
左上角到右下角的最短路径,格式如样例所示。
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4)(4, 4)
题解报告:一道关于bfs的题目,不难,但是在输出方面卡了好久,一直不知道如何输出,裹了半天才弄明白,利用一个数组储存来自四个方向的路径,然后通过递归输出即可!
#include<algorithm> #include<queue> #include<cstdio> using namespace std; int num[7][7]; int sign[6][6]; struct node{ int x,y; }; node move[4]={{1,0},{-1,0},{0,-1},{0,1}}; void print(int x,int y) { if(sign[x][y]==-1) { cout<<"("<<x<<", "<<y<<")"<<endl; return; } print(x-move[sign[x][y]-1].x,y-move[sign[x][y]-1].y); cout<<"("<<x<<", "<<y<<")"<<endl; } void bfs(node begin) { queue<node>w; node begin1,end1; w.push(begin); sign[begin.x][begin.y]=-1; while(!w.empty()) { begin1=w.front(); w.pop(); if(begin1.x==4&&begin1.y==4) break; for(int i=0;i<4;i++) { end1.x=begin1.x+move[i].x; end1.y=begin1.y+move[i].y; if(end1.x>=0&&end1.y>=0&&end1.x<5&&end1.y<5&&num[end1.x][end1.y]!=1&&!sign[end1.x][end1.y]) { w.push(end1); sign[end1.x][end1.y]=i+1; //1 2 3 4上下左右过来的点 } } } print(4,4); } int main() { node begin,end; for(int i=0;i<5;i++) { for(int j=0;j<5;j++) cin>>num[i][j]; } begin.x=0,begin.y=0; bfs(begin); return 0; }