样例输入:
3
.xA
...
Bx.
样例输出:
6
思路分析:
这道题只需要在正常的广搜模板上多维护一个— —方向,如果当前改变方向,就坐标不变,方向变,步数加一;否则坐标变,方向不变,步数加一。
#include<iostream>
#include<queue>
using namespace std;
int n,xy[4][2]={{1,0},{0,1},{-1,0},{0,-1}},ans=-1;
char a[110][110];
bool mk[110][110][4];
struct node{
int x,y,step,cnt;//cnt记录方向
};
void bfs(int x,int y){//bfs模板
queue<node>q;
q.push((node){x,y,0,-1});//起点方向标记-1
while(q.size()){
node t=q.front();
if(a[t.x][t.y]=='B'){//判断是否到终点
ans=t.step;
return;
}
q.pop();
for(int i=0;i<4;i++){
int xx=t.x+xy[i][0],yy=t.y+xy[i][1];//偏移量
if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&a[xx][yy]!='x'&&mk[xx][yy][i]==0){//判断越界等
if(t.cnt==-1||t.cnt==i){//特判-1和方向不变
mk[xx][yy][i]=1;
q.push((node){xx,yy,t.step+1,i});
}else{//方向改变
q.push((node){t.x,t.y,t.step+1,i});
}
}
}
}
}
int main(){
cin>>n;
int x,y;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
if(a[i][j]=='A'){
x=i,y=j;
}
}
}
bfs(x,y);
cout<<ans;
return 0;
}