一、题目描述
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。
输入
-
第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口。
输出
- 输出从起点到出口最少需要走的步数。 样例输入
-
3 3 S#T .#. ...
样例输出
二、算法分析
这一道题明显用广搜算法,用队列。注意把父节点pop()掉,建议用数组变量来控制方向。
void bfs()
{
f=0;
int k1,k2;
while(!s1.empty())//队列不为空
{
for(int i=0;i<=3;i++)//寻找该父节点的子节点
{
if(s1.back()==e&&s2.back()==r){//找到解
f=1;
break;
}
k1=s1.front()+sx[i];k2=s2.front()+zy[i];
if(k1>=1&&k1<=n&&k2>=1&&k2<=m&&a[k1][k2]!='#'){//当该子节点符合条件
s1.push(k1);//记录目前坐标
s2.push(k2);
sum.push(sum.front()+1);//累加sum
a[k1][k2]='#';
}
}
if(f==1)
break;
s1.pop();//子节点找完了,pop()掉父节点
s2.pop();
sum.pop();
}
if(f==1)//特殊处理
aa=sum.back();
if(f==0)
aa=0;
return;
}
我刚开始学广搜时,觉得广搜非常复杂,但到了后来用惯了,才觉得广搜有许多优点。
上面的这一道题用深搜无法解决,用广搜比较容易。
以上的代码只是广搜部分,在主程序中要注意对细节的处理。
易错点:if()判断要写在寻找子节点的循环内!