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,转载请注明来源
  • 相关阅读:
    过滤器(Filter)
    DBUtils结果集处理器介绍
    Tomcat配置连接c3p0连接池
    JdbcUtils
    数据库连接池
    JDBC处理事务
    JDBC入门(5)--- 时间类型、大数据
    JDBC入门(4)--- 批处理
    JDBC入门(3)--- PrepareStatement
    JDBC入门(2)--- ResultSet之滚动结果集
  • 原文地址:https://www.cnblogs.com/zhber/p/4035942.html
Copyright © 2011-2022 走看看