比赛 |
20150421 |
评测结果 |
AEEAEEEEAA |
题目名称 |
飞越原野 |
最终得分 |
40 |
用户昵称 |
清羽 |
运行时间 |
0.762 s |
代码语言 |
C++ |
内存使用 |
10.57 MiB |
提交时间 |
2015-04-21 10:06:48 |
显示代码纯文本
//规定:还没有计算出的状态不能走
#include<cstdio>
#include<iostream>
#include<cstring>
#include<ctime>
#include<algorithm>
using namespace std;
const int maxn=150;
const int INF=2000000000;
const int dx[]={0,1,-1,0};
const int dy[]={1,0,0,-1};
char buf[40],c[maxn][maxn];
int n,m,d,f[maxn][maxn][maxn];
template<class T> inline bool getd(T& x)
{
int ch=getchar();
bool neg=false;
while(ch!=EOF && ch!='-' && !isdigit(ch)) ch=getchar();
if(ch==EOF) return false;
if(ch=='-'){
neg=true;
ch=getchar();
}
x=ch-'0';
while(isdigit(ch=getchar())) x=x*10+ch-'0';
if(neg) x=-x;
return true;
}
template<class M> inline void putd(M x)
{
int p=0;
if(x<0){
putchar('-');
x=-x;
}
if(x==0) buf[p++]=0;
while(x){
buf[p++]=x%10;
x/=10;
}
for(int i=p-1;i>=0;i--) putchar(buf[i]+'0');
}
int dfs(int x,int y,int d)
{
// printf("x=%d,y=%d,d=%d\n",x,y,d);
if(x<0 || y<0 || x>m-1 || y>n-1 || c[x][y]=='L') return INF;
if(f[x][y][d]!=-1) return f[x][y][d];
int ans;
ans=f[x][y][d]=INF;
//步行
for(int i=0;i<4;i++)
if(f[x+dx[i]][y+dy[i]][d]!=INF)
ans=min(ans,dfs(x+dx[i],y+dy[i],d)+1);
//飞行
for(int i=1;i<=d;i++){
if(f[x+i][y][d-i]!=INF) ans=min(ans,dfs(x+i,y,d-i)+1);
if(f[x][y+i][d-i]!=INF) ans=min(ans,dfs(x,y+i,d-i)+1);
if(f[x-i][y][d-i]!=INF) ans=min(ans,dfs(x-i,y,d-i)+1);
if(f[x][y-i][d-i]!=INF) ans=min(ans,dfs(x,y-i,d-i)+1);
}
return f[x][y][d]=ans;
}
void init()
{
getd(m);getd(n);getd(d);
// printf("m=%d,n=%d,d=%d\n",m,n,d);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
int ch=getchar();
while(ch!='P' && ch!='L') ch=getchar();
c[i][j]=ch;
}
}
void work()
{
memset(f,-1,sizeof(f));
for(int i=0;i<=d;i++) f[m-1][n-1][i]=0;
int x=dfs(0,0,d);
if(x!=INF) printf("%d\n",x);
else printf("impossible\n");
}
int main()
{
freopen("escapea.in","r",stdin);
freopen("escapea.out","w",stdout);
init();
work();
fclose(stdin);
fclose(stdout);
return 0;
}