http://sfiction.blog.163.com/blog/static/19940401020124355831319/ 感谢作者的思路拯救了我
//挖掘机_Coder_zha学习之路
#include <stdio.h>
void Init();
int Go(int k);
int BFS();
int a[40][40],d[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
int e[2][8][2]={{{0,-1},{-1,0},{0,1},{1,0},{0,-1},{-1,0},{0,1},{1,0}},{{0,1},{-1,0},{0,-1},{1,0},{0,1},{-1,0},{0,-1},{1,0}}};
//第一组是左转的坐标加法,第二组是右转的坐标加法。
int n,m,x0,y0,x1,y1;
void Init()
{
int i,j;
char chr;
for (i=0;i<n;i++)
for (getchar(),j=0;j<m;j++)
{
scanf("%c",&chr);
if (chr=='#') a[i][j]=-1;
else
{
if (chr=='S') {x0=i;y0=j;}
else if (chr=='E') {x1=i;y1=j;}
a[i][j]=0;
}
}
}
int Go(int k)//把两个方向的搜索合并成了一个函数,以下注释以向左为例//用k的值来控制左转,右转。
{
int d,i,x,y,x2,y2,s=1;
a[x1][y1]=2;
d=0;//初始方向无所谓,因为出口周围四个方向只有一个是空地,第一次行走必然会调整好
x=x0;
y=y0;
while (a[x][y]==0)
for (d=(d+3)%4,i=d;i<d+4;i++)//以左转90°后的方向为第一优先,依次右转90°找可能的通路
{
x2=x+e[k][i][0];//目标格子
y2=y+e[k][i][1];
if (x2>=0&&y2>=0&&x2<n&&y2<m&&a[x2][y2]>=0)//边界即空地判定
{
x=x2;
y=y2;
d=i%4;//设定新方向??????
s++;//记录步数
break;//完成一次。
}
}
return s;
}
int BFS()//宽搜解决最短路径
{
int c[1600][2];
int i,j,t0,t1,t2,t3,x,y;
a[x1][y1]=0;
c[0][0]=x0;
c[0][1]=y0;
a[x0][y0]=1;
t1=0;
t2=t3=1;
t0=2;
for (t1=0,t2=t3=1;t1<t2;t1=t2,t2=t3,t0++)
for (i=t1;i<t2;i++)
{
for (j=0;j<4;j++)
{
x=c[i][0]+d[j][0];
y=c[i][1]+d[j][1];
if (x>=0&&y>=0&&x<n&&y<m&&a[x][y]==0)
{
c[t3][0]=x;
c[t3][1]=y;
a[x][y]=t0;
t3++;
}
}
if (a[x1][y1]>0) return a[x1][y1];
}
return 0;
}
int main()
{
int n1;
scanf("%d",&n1);
for (;n1>0;n1--)
{
scanf("%d%d",&m,&n);
Init();
printf("%d ",Go(0));
printf("%d ",Go(1));
printf("%d\n",BFS());
}
return 0;
}
bfs好理解,就是原作者的转向搜索有点喵,不错不错,学习到了