最少转弯问题(turn)
思路:一道标准的广搜题(虽然说深搜好像也能过 ) ,难点在于如何判断转弯。
因为要记录转弯,所以我们就需要在大结构体里在定义一个记录方向的变量f,然后就正常广搜就行了。代码细节还是挺多的,具体注释吧。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,x1,y,x2,y2,h,t,a[120][120];
int fx[5]={0,1,0,-1,0},fy[5]={0,0,1,0,-1};//转向数组
struct node
{
int x,y,z,f; // x,y是坐标,z是转弯数,f是方向
}b[100100];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
scanf("%d%d%d%d",&x1,&y,&x2,&y2);
b[1].x=x1;b[1].y=y;b[1].z=0;b[1].f=-1; // 第一次方向随便,特殊处理
h=0;t=1;//队头,队尾
do{//bfs模板
h++;
for(int i=1;i<=4;i++)
{
int xx=b[h].x+fx[i],yy=b[h].y+fy[i];
if(xx>0&&xx<=n&&yy>0&&yy<=m&&a[xx][yy]!=1)
{
t++;
b[t].x=xx;
b[t].y=yy;
if(i%2!=b[h].f&&b[h].f!=-1) //判断和上一次方向是不是一样,并且父节点不是第一个,i%2用来判断方向
{
b[t].z=b[h].z+1;
b[t].f=i%2; //改变方向,转弯数+1
}
else
{
b[t].z=b[h].z; //转弯数一样
if (b[h].f==-1) b[t].f=i%2; //父节点是第一个,要保存本次方向
else b[t].f=b[h].f; //父节点不是第一个,方向不变
}
if (xx==x2&&yy==y2)
{
cout<<b[t].z<<endl;
return 0;
}
}
}
}while(h<t);
return 0;
}