http://poj.org/problem?id=3083
一开始没明白题意以为只是简单的(顺时针或逆时针),wa一次。。。。
1、至于求最短距离,毋庸置疑,肯定是bfs,这个就不多说了
2、对于向左和向右的理解上,我当初一直不明白,读了老长时间,没有看懂,到discuss里看了一个人的叙述,终于明白意思了……就是这样,一直沿着向左或向右的方向走,能走就走,不能走就回撤,所以这个dfs不能标记遍历过的点,这是很显然的。
3、dfs方向的选择,就是要保证沿着向左或者向右的方向走
( 向左是顺时针,向右是逆时针转)
#include<stdio.h>
#include<string.h>
#define N 100
#include<queue>
using namespace std;
char map[N][N];
int step,sx,sy,ex,ey,r,c,vis[N][N];
int dl[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
int dr[4][2]={{0,-1},{1,0},{0,1},{-1,0}};
struct node
{
int x,y,step;
}q[N*N];
void dfs_l(int x,int y,int dir)
{
if(x==ex&&y==ey)return;
int t=(dir+3)%4;
int dx=x+dl[t][0];
int dy=y+dl[t][1];
if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
{
step++;
dfs_l(dx,dy,t);
}
else
{
int dx=x+dl[dir][0];
int dy=y+dl[dir][1];
if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
{
step++;
dfs_l(dx,dy,dir);
}
else
{
int t=(dir+1)%4;
int dx=x+dl[t][0];
int dy=y+dl[t][1];
if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
{
step++;
dfs_l(dx,dy,t);
}
else
{
int t=(dir+2)%4;
int dx=x+dl[t][0];
int dy=y+dl[t][1];
if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
{
step++;
dfs_l(dx,dy,t);
}
}
}
}
}
void dfs_r(int x,int y,int dir)
{
if(x==ex&&y==ey)return;
int t=(dir+1)%4;
int dx=x+dl[t][0];
int dy=y+dl[t][1];
if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
{
step++;
dfs_r(dx,dy,t);
}
else
{
int t=dir;
int dx=x+dl[t][0];
int dy=y+dl[t][1];
if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
{
step++;
dfs_r(dx,dy,t);
}
else
{
int t=(dir+3)%4;
int dx=x+dl[t][0];
int dy=y+dl[t][1];
if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
{
step++;
dfs_r(dx,dy,t);
}
else
{ int t=(dir+2)%4;
int dx=x+dl[t][0];
int dy=y+dl[t][1];
if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
{
step++;
dfs_r(dx,dy,t);
}
}
}
}
}
int bfs(int x,int y)
{
int head=0,tail=0;
q[head].x=x;
q[head].y=y;
q[head].step=1;
vis[x][y]=1;
tail++;
while(head<tail)
{
for(int i=0;i<4;i++)
{
int dx=q[head].x+dl[i][0];
int dy=q[head].y+dl[i][1];
int num=q[head].step;
if(dx==ex&&dy==ey)return num+1;
else
{
if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
{
if(!vis[dx][dy])
{
vis[dx][dy]=1;
q[tail].x=dx;
q[tail].y=dy;
q[tail].step=num+1;
tail++;
}
}
}
}
head++;
}
return 0;
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&c,&r);
getchar();
for(i=0;i<r;i++)
{
scanf("%s",map[i]);
}
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
if(map[i][j]=='S')
{
sx=i;
sy=j;
}
if(map[i][j]=='E')
{
ex=i;
ey=j;
}
}
}
//printf("%d %d %d %d\n",sx,sy,ex,ey);
int dir;
if(sx==0)
dir=3;
else if(sx==r-1)
dir=1;
else if(sy==0)
dir=2;
else
dir=0;
int k=dir;
step=0;
dfs_l(sx,sy,dir);
printf("%d ",step+1);
dir=k;
step=0;
dfs_r(sx,sy,dir);
printf("%d ",step+1);
memset(vis,0,sizeof(vis));
int ans=bfs(sx,sy);
printf("%d\n",ans);
}
}