题目链接:
http://poj.org/problem?id=3083
中文题意:
表示这个人写比较清楚。。
http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122369.html
每次默认向上为刚开始的方向。
及其恶心的题,bfs加dfs
代码:
#include
#include
#include
#include
#include
using namespace std;
int ans1,ans2,dis[45][45],flag,T,n,m,f[45][45],opx,opy,edx,edy;
int der[2][4]={{-1,0,1, 0},
{ 0,-1,0,1}};
struct node{
int x;int y;
};
char c[45];
queue q;
void dfs1(int x,int y,int step,int d)
{
if (flag==1) return ;
if (x==edx && y==edy)
{
ans1=step;flag=1;
return ;
}
for (int i=3;i<=6;i++)
{
int nex=x+der[0][(d+i)%4];
int ney=y+der[1][(d+i)%4];
if (nex>=1 && nex<=n && ney>=1 && ney<=m)
{
if (f[nex][ney]==0)
dfs1(nex,ney,step+1,(d+i)%4);
}
}
}
void dfs2(int x,int y,int step,int d)
{
if (flag==1) return ;
if (x==edx && y==edy)
{
ans2=step;flag=1;
return ;
}
for (int i=1;i>=-2;i--)
{
int nex=x+der[0][(d+i+4)%4];
int ney=y+der[1][(d+i+4)%4];
if (nex>=1 && nex<=n && ney>=1 && ney<=m)
{
if (f[nex][ney]==0)
dfs2(nex,ney,step+1,(d+i+4)%4);
}
}
}
void bfs(int x,int y)
{
node op;
op.x=opx;
op.y=opy;
q.push(op);
flag=0;
dis[opx][opy]=1;
while(flag==0 && !q.empty())
{
node now=q.front();
q.pop();
for (int i=0;i<=3;i++)
{
int nex=now.x+der[0][i];
int ney=now.y+der[1][i];
if ( nex>=1 && nex<=n && ney>=1 && ney<=m)
{
if (f[nex][ney]==0 && dis[nex][ney]==-1)
{
dis[nex][ney]=dis[now.x][now.y]+1;
node ne;
ne.x=nex;
ne.y=ney;
q.push(ne);
}
}
if (nex==edx&&ney==edy)
{
flag=1;
break;
}
}
}
}
int main()
{
scanf("%d",&T);
for (int t=1;t<=T;t++)
{
memset(dis,-1,sizeof(dis));
while(!q.empty())
q.pop();
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%s",c);
for (int j=0;jif (c[j]=='#') f[j][i]=1;
else f[j][i]=0;
if (c[j]=='S') opy=i,opx=j;
if (c[j]=='E') edy=i,edx=j;
}
}
flag=0;
dfs1(opx,opy,1,1);
flag=0;
dfs2(opx,opy,1,1);
bfs(opx,opy);
printf("%d %d %d\n",ans1,ans2,dis[edx][edy]);
}
}