http://poj.org/problem?id=3083题意就是在图里遍历遍历:bfs+dfs.
哈哈,dfs,顺时针和逆时针,学会这个好方法真好。
刚刚开始好恶心恶心的说,没有找到好办法,经验太少了。嘿嘿,慢慢积累经验哈。
代码好丑,需要改改了:
#include<stdio.h>
#include<string.h>
#include<math.h>
int t,n,m,xs,ys,xx,yy,least,right,left,step;
int a[45][45],vis[45][45],que[20005][2];
int go[4][2]= {{-1,0},{0,1},{1,0},{0,-1}};
int bfs(int x,int y)
{
int head,tail,x1,y1,x2,y2,i;
head=0;
tail=1;
que[1][0]=x;
que[1][1]=y;
vis[x][y]=1;
while (head<tail)
{
head++;
x1=que[head][0];
y1=que[head][1];
for (i=0; i<4 ; i++ )
{
x2=x1+go[i][0];
y2=y1+go[i][1];
if (a[x2][y2]&&!vis[x2][y2])
{
tail++;
if (x2==xx&&y2==yy)
return vis[x1][y1]+1;
que[tail][0]=x2;
que[tail][1]=y2;
vis[x2][y2]=vis[x1][y1]+1;
}
}
}
}
int dfs(int g,int x,int y,int k) //这里确定下一步该走哪个方向。需要找到第一个可以走的方向。
{
int i,x1,y1,gg;
step=1;
while (x!=xx||y!=yy)
{
for (i=1; i<=4 ; i++ )
{
gg=(g+k*i+4)%4;
x1=x+go[gg][0];
y1=y+go[gg][1];
if (a[x1][y1]) //如果当前可走就break;
break;
}
step++;
g=(gg+2)%4; //由x,y向gg方向走去x1,y1,则是通过(gg+2)%4这个方向到达x1,y1的。然后循环迭代。
x=x1;
y=y1;
}
}
int init()
{
int i,j;
char st[50];
scanf("%d%d",&m,&n);
memset(a,0,sizeof(a));
for (i=1; i<=n ; i++ )
{
getchar();
scanf("%s",&st);
for (j=0; j<m ; j++ )
{
if (st[j]!='#')
a[i][j+1]=1;
if (st[j]=='S')
xs=i,ys=j+1;
if (st[j]=='E')
xx=i,yy=j+1;
}
}
}
int work()
{
int g;
memset(vis,0,sizeof(vis));
least=bfs(xs,ys);
if (xs==1)
g=0;
else if (ys==m)
g=1;
else if (xs==n)
g=2;
else
g=3;
dfs(g,xs,ys,1);
left=step;
dfs(g,xs,ys,-1);
right=step;
}
int main()
{
scanf("%d",&t);
while (t--)
{
init();
work();
printf("%d %d %d\n",left,right,least);
}
return 0;
}
额,bfs和dfs写了好几个咯,该学学剪枝啦。好多东西呢,