问题及代码:
给出迷宫的图纸和初始终点位置,用DFS求最小步数。
#include <iostream> #include <cstring> using namespace std; int a[51][51],book[51][51]; int sx,sy,n,m,p,q; struct note { int x,y,f,s;//坐标、父亲在队列中的编号(不求路径,可省略)、步数 } que[2501]; void bfs(int x,int y) { int next[4][2]= {{0,1},{1,0},{0,-1},{-1,0}}; //右下左上 int head=1,tail=1; int k,tx,ty,flag=0; que[tail].x=sx; que[tail].y=sy; que[tail].f=que[tail].s=0; ++tail; while(head<tail) { for(k=0; k<4; ++k) { tx=que[head].x+next[k][0]; ty=que[head].y+next[k][1]; if(tx<1||tx>n||ty<1||ty>m)//越界 continue; if(a[tx][ty]==0&&book[tx][ty]==0) { book[tx][ty]=1;//BFS每个点只入队一次,所以不需要还原book que[tail].x=tx; que[tail].y=ty; que[tail].f=head;//因为这个点是head扩展出来的,所以其父亲是head que[tail].s=que[head].s+1;//步数是父亲的步数加一 ++tail; } if(tx==p&&ty==q) { flag=1; break; } } if(flag==1) { cout<<que[tail-1].s<<endl; break; } ++head; } return ;//啊啊啊!!这里一定要return~不然返回不了试探失败的点从而再次试探 } int main() { memset(a,0,sizeof(a)); memset(book,0,sizeof(book)); int i,j; cin>>n>>m;//行、列 for(i=1; i<=n; ++i) for(j=1; j<=m; ++j) cin>>a[i][j];//迷宫图 cin>>sx>>sy>>p>>q;//迷宫入口和目标坐标 book[sx][sx]=1;//从起点开始搜索,且起点已经在路程中 bfs(sx,sy);//0表示初始步数 return 0; } /*测试用例 5 4 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 4 3 */
运行结果:
道理我都懂,可就是写不好。
DFS和BFS原理我都明白,后来勉强会写DFS,BFS用的很少,太生了,连是用队列实现的都忘了。