zoukankan      html  css  js  c++  java
  • bzoj1644 [Usaco2007 Oct]Obstacle Course 障碍训练课

    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);
    }


    ——by zhber,转载请注明来源
  • 相关阅读:
    一、
    【2019-11-25】美好需要主动去发现
    《软件方法(上)》读书笔记
    【2019-11-24】读书让人美丽
    【2019-11-23】让别人来管理自己
    【2019-11-22】不聪明只有靠笨方法了
    【2019-11-21】要像人一样思考
    【2019-11-20】作为丈夫的反省
    【2019-11-19】基础科学的意义发现
    【2019-11-18】重新审视一下自己的思维
  • 原文地址:https://www.cnblogs.com/zhber/p/4035942.html
Copyright © 2011-2022 走看看