zhber
有好多做过的题没写下来,如果我还能记得就补吧

Description

考虑一个 N x N (1 <= N <= 100)的有1个个方格组成的正方形牧场。有些方格是奶牛们不能踏上的,它们被标记为了'x'。例如下图:

. . B x .
. x x A .
. . . x .
. x . . .
. . x . .

贝茜发现自己恰好在点A处,她想去B处的盐块舔盐。缓慢而且笨拙的动物,比如奶牛,十分讨厌转弯。尽管如此,当然在必要的时候她们还是会转弯的。对于一个给定的牧场,请你计算从A到B最少的转弯次数。开始的时候,贝茜可以使面对任意一个方向。贝茜知道她一定可以到达。

Input

第 1行: 一个整数 N 行

2..N + 1: 行 i+1 有 N 个字符 ('.', 'x', 'A', 'B'),表示每个点的状态。

Output

行 1: 一个整数,最少的转弯次数。

Sample Input

3
.xA
...
Bx.

Sample Output

2
 

广搜……不解释

只要注意搜到某个点朝某个方向的时候向四个方向都判一下转个方向入队

#include<cstdio>
#include<cstring>
const int mx[4]={1,0,-1,0};
const int my[4]={0,1,0,-1};
int n,sx,sy,ex,ey,ans=100000,t,w;
int dist[4][110][110];
int q[100001];
int dire[100001];
bool map[110][110];
char ch[110];
inline int min(int a,int b){return a<b?a:b;}
inline void bfs()
{
	for (int i=0;i<4;i++)
	{
		q[++w]=(sx-1)*n+sy;
		dire[w]=i;
		dist[i][sx][sy]=1;
	}
	while (t<w)
	{
		int nx;if(q[++t]%n)nx=q[t]/n+1;else nx=q[t]/n;
		int ny=q[t]%n;if (!ny)ny=n;
		int d=dire[t];
		int step=dist[d][nx][ny];
		for (int k=0;k<4;k++)
		  if (step+1<dist[k][nx][ny])
		  {
		  	dist[k][nx][ny]=step+1;
		  	q[++w]=(nx-1)*n+ny;
		  	dire[w]=k;
		  }
		int wx=nx+mx[d];
		int wy=ny+my[d];
		if (wx<1||wy<1||wx>n||wy>n||!map[wx][wy])continue;
		if (step<dist[d][wx][wy])
		{
			dist[d][wx][wy]=step;
		  	q[++w]=(wx-1)*n+wy;
			dire[w]=d;
		}
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%s",ch);
		for (int j=0;ch[j];j++)
		{
			if (ch[j]=='A')
			{
				sx=i;
				sy=j+1;
				map[i][j+1]=1;
			}else
			if (ch[j]=='B')
			{
				ex=i;
				ey=j+1;
				map[i][j+1]=1;
			}else
			if (ch[j]=='.')map[i][j+1]=1;
		}	
	}
	memset(dist,127/3,sizeof(dist));
	bfs();
	for(int i=0;i<4;i++)
	  if (dist[i][ex][ey])ans=min(ans,dist[i][ex][ey]);
	printf("%d",ans-1);
}


posted on 2014-07-30 21:22  zhber  阅读(256)  评论(0编辑  收藏  举报