本想用深搜水题,然而几乎所有的题都是最少步数,所以广搜更方便
例如
【题目描述】
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。
【输入】
第一行是两个整数n和m(1≤n,m≤100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符‘.’表示空地,‘#’表示墙,‘S’表示起点,‘T’表示出口。
【输出】
输出从起点到出口最少需要走的步数。
【输入样例】
3 3 S#T .#. ...
【输出样例】
6
代码:
#include<bits/stdc++.h> using namespace std; int mx[4]={0,1,0,-1},my[4]={1,0,-1,0}; bool a[105][105]; int n,m,sx,sy,fx,fy,nowx,nowy,nows,i,j,l; bool flag; struct node{ int x,y,s; node(int a,int b,int c):x(a),y(b),s(c){}; }; bool inside(int x,int y){ return (1<=x&&x<=n)&&(1<=y&&y<=m); } queue<node>q; int main(){ char c; cin>>n>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++){ cin>>c; if(c=='#') a[i][j]=1; if(c=='S') sx=i,sy=j; if(c=='T') fx=i,fy=j; } q.push(node(sx,sy,0)); a[sx][sy]=1; flag=0; while(!q.empty()){ for(l=0;l<=3;l++){ node k=q.front(); nowx=k.x+mx[l]; nowy=k.y+my[l]; if(!a[nowx][nowy]&&inside(nowx,nowy)){ a[nowx][nowy]=1; q.push(node(nowx,nowy,k.s+1)); } if(nowx==fx&&nowy==fy){ flag=1; break; } } if(flag) break; q.pop(); } node k=q.back(); cout<<k.s; return 0; }
思路同其他搜索题,之前整理过,现在来谈谈为什么广搜是最少步数的最优解法
广搜从思路来看是把每一步的每种可能情况进行讨论,一旦到达终点,就输出,因为步数是从1(也有题是0)累加的,第一个合法答案一定是最近的,同样,广搜也可用于计算“费用”与步数成正比的搜索题,可更方便地求得答案。