记录编号 531990 评测结果 AWAAAAAWAAAAAAAAAAAAAAAAA
题目名称 [USACO Oct07] 障碍训练场 最终得分 92
用户昵称 Gravatar斯内普和骑士 是否通过 未通过
代码语言 C++ 运行时间 0.034 s
提交时间 2019-05-22 17:05:32 内存使用 13.90 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int RUA=101;
struct pd
{
    int x;
    int y;
}hrb[20050];//队列,保存状态 
int lxy[RUA][RUA],emm[RUA][RUA];//lxy起到bool 作用,emm记录拐弯次数 
int n,m,i,j,k,l;
int r=1;
int x,y;
char tu[RUA][RUA];//原图 
int xy[4]={1,-1,0,0},yx[4]={0,0,-1,1};//坐标变量 
int main()
{
	freopen("obstacle.in","r",stdin);
    freopen("obstacle.out","w",stdout);
    cin>>n;
    for(i=1;i<=n;i++)
    	for(int k=1;k<=n;k++)
    	{
    		cin>>tu[i][k];
    		if(tu[i][k]=='A')
    		{
    			hrb[l].x=i;
    			hrb[l].y=k;
    			lxy[i][k]=1;
    		}
    		if(tu[i][k]=='B')
    		{
    			x=i;
    			y=k;
    		}
    		if(tu[i][k]=='x')
    		lxy[i][k]=1;
    		//对图进行处理,障碍物和起点为1,表示什么就不用再解释了 
    	}
    while(l<r)//暴搜开始 
    {
    	for(i=0;i<4;i++)//枚举坐标变量,四个方向,左上右下移动 
    	for(k=1;;k++)
    	{
    		int xx=hrb[l].x+k*xy[i],yy=hrb[l].y+k*yx[i];
            //枚举一个常数k,与坐标变量相乘
            if(lxy[xx][yy]==1)break;
            if(xx<=0||xx>n||yy<=0||yy>n)break;
            //碰边或走过了,停止填充
            lxy[xx][yy]=1;//打标记
            emm[xx][yy]=emm[hrb[l].x][hrb[l].y]+1;
            //停了,说明该转弯了,于是当前点的次数为原坐标的加1
            hrb[r].x=xx;
            hrb[r].y=yy;
            r++;//进行队列
    	} 
    	l++;
    }
    if(emm[x][y]!=0)
    printf("%d",emm[x][y]-1);
    else
    cout<<"-1";
    return 0;
}