记录编号 300957 评测结果 AAAAAAAAAAAAA
题目名称 [USACO Feb07] 青铜莲花池 最终得分 100
用户昵称 Gravatar安呐一条小咸鱼。 是否通过 通过
代码语言 C++ 运行时间 0.021 s
提交时间 2016-08-29 16:19:27 内存使用 0.30 MiB
显示代码纯文本
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int map[35][35];
bool vis[35][35];
int dx[10],dy[10];
int m,n,m1,m2;
int bx,by,ex,ey;
char c;
struct Node{
	int x,y,step;
	Node(int a=0,int b=0,int z=0){ x=a,y=b,step=z;	}		
};
queue<Node> q;
int main()
{
	freopen("bronlily.in","r",stdin);
	freopen("bronlily.out","w",stdout);
    scanf("%d%d%d%d",&m,&n,&m1,&m2);
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++){
            cin>>c;
        	if(c=='4')ex=i,ey=j,map[i][j]=1;    
            if(c=='3')bx=i,by=j,map[i][j]=1;
            if(c=='1')map[i][j]=1;
        }
    }
    dx[1]=m1,dx[2]=m1,dx[3]=m2,dx[4]=m2,dx[5]=-m1,dx[6]=-m1,dx[7]=-m2,dx[8]=-m2;
    dy[1]=-m2,dy[2]=m2,dy[3]=-m1,dy[4]=m1,dy[5]=m2,dy[6]=-m2,dy[7]=m1,dy[8]=-m1;
    q.push(Node(bx,by,0));
    Node a,b;
    while(!q.empty())
    {
		a=q.front();
		q.pop();
		for(int i=1;i<=8;i++)
		{
			b=a;
			b.x=a.x+dx[i];
			b.y=a.y+dy[i];
			b.step=a.step+1;
			if(b.x>m||b.y<1||b.y>n||b.x<1)continue;
			if(b.x==ex&&b.y==ey)
			{
				printf("%d\n",b.step);
				return 0;
			}
			if(map[b.x][b.y]==1&&!vis[b.x][b.y])
			{
				vis[b.x][b.y]=1;
				q.push(b);
			}
		}
	}
	return 0;
}