记录编号 |
342593 |
评测结果 |
AAAAAAAAAAAAA |
题目名称 |
[USACO Feb07] 青铜莲花池 |
最终得分 |
100 |
用户昵称 |
残星誓言 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.040 s |
提交时间 |
2016-11-08 17:29:44 |
内存使用 |
0.28 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=50;
struct zb
{
int x;int y; int ci;
} s,t;
queue<zb> q;
int tool[10];
int tool2[10];
int m,n,m1,m2;
int ans=2147483647;
int mp[maxn][maxn];
bool vis[maxn][maxn];
int bfs()
{
s.ci=0;
q.push(s);
memset(vis,0,sizeof(vis));
while(!q.empty())
{
zb x=q.front(); q.pop(); //printf("%d %d\n",x.x,x.y);
if(x.x==t.x&&x.y==t.y)
{
return x.ci;
}
for(int i=0;i<=3;i++)
{
zb nx;
nx.x=x.x+tool[i];
nx.y=x.y+tool2[i]; nx.ci=x.ci+1;//printf(" %d %d\n",nx.x,nx.y);
if(nx.x>0&&nx.y>0&&nx.x<=m&&nx.y<=n&&mp[nx.x][nx.y]!=0&&mp[nx.x][nx.y]!=2&&!vis[nx.x][nx.y])
{
q.push(nx);
vis[nx.x][nx.y]=1;
}
nx.x=x.x+tool[i];
nx.y=x.y-tool2[i]; nx.ci=x.ci+1;//printf(" %d %d\n",nx.x,nx.y);
if(nx.x>0&&nx.y>0&&nx.x<=m&&nx.y<=n&&mp[nx.x][nx.y]!=0&&mp[nx.x][nx.y]!=2&&!vis[nx.x][nx.y])
{
q.push(nx);
vis[nx.x][nx.y]=1;
}
}
}
}
int main()
{
freopen("bronlily.in","r",stdin);
freopen("bronlily.out","w",stdout);
scanf("%d%d%d%d",&m,&n,&m1,&m2);
tool[0]=m1; tool[1]=0-m1; tool[2]=m2;tool[3]=0-m2;
tool2[0]=m2;tool2[1]=m2;tool2[2]=m1; tool2[3]=m1;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&mp[i][j]);
if(mp[i][j]==3)
s.x=i,s.y=j;
else
if(mp[i][j]==4)
t.x=i,t.y=j;
}
ans=bfs();
printf("%d",ans);
return 0;
}