比赛 |
20120309 |
评测结果 |
WAAAWWTTWW |
题目名称 |
飞越原野 |
最终得分 |
30 |
用户昵称 |
苏轼 |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2012-03-09 22:16:29 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
struct hehe
{
int x0,y0,t,neng;
}q[1000001];
int w[101][101],f[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int m,n,d,tou,wei,answer=10000000;
bool check(int x);
void bfs(int x);
int main()
{
freopen ("escapea.in","r",stdin);
freopen ("escapea.out","w",stdout);
cin>>m>>n>>d;
for (int i=1;i<=m;i++)
{
for (int j=1;j<=n;j++)
{
char a;
cin>>a;
if (a=='P')
w[i][j]=1;
else
w[i][j]=0;
}
}
q[0].x0=1;
q[0].y0=1;
q[0].t=0;
q[0].neng=d;
tou=0;
wei=0;
while (tou<=wei)
{
bfs(tou);
if (q[tou].x0==m&&q[tou].y0==n)
{
if (q[tou].t<answer)
{
answer=q[tou].t;
}
}
tou++;
}
if (answer==10000000)
cout<<"impossible";
else
cout<<answer;
return 0;
}
void bfs(int x)
{
for (int i=0;i<4;i++)
{
int nx,ny;
nx=q[x].x0+f[i][0];
ny=q[x].y0+f[i][1];
if (ny<=n&&nx<=m&&nx>0&&ny>0&&w[nx][ny])
{
wei++;
q[wei].x0=nx;
q[wei].y0=ny;
q[wei].t=q[x].t+1;
q[wei].neng=q[x].neng;
if (!check(wei))
{
wei--;
goto ne;
}
}
ne:;
for (int j=2;j<=q[x].neng;++j)
{
int xx,yy;
xx=q[x].x0+j*f[i][0];
yy=q[x].y0+j*f[i][1];
if (yy<=n&&xx<=m&&xx>0&&yy>0&&w[xx][yy])
{
wei++;
q[wei].x0=xx;
q[wei].y0=yy;
q[wei].t=q[x].t+1;
q[wei].neng=q[x].neng-j;
if (!check(wei))
{
wei--;
continue;
}
}
}
}
}
bool check(int x)
{
for (int i=0;i<x;i++)
{
if (q[i].x0==q[x].x0&&q[i].y0==q[x].y0&&q[x].t>=q[i].t&&q[i].neng<=q[x].neng)
{
return false;
}
}
return true;
}