比赛 20150421 评测结果 WEEWEEEEEW
题目名称 飞越原野 最终得分 0
用户昵称 ggwdwsbs 运行时间 1.216 s
代码语言 C++ 内存使用 3.81 MiB
提交时间 2015-04-21 11:58:35
显示代码纯文本
#include<stdio.h>
#include<cstring>
const int maxn=101;
const int INF=2147483600;
int f[maxn][maxn][maxn];
char map[maxn][maxn];
int dx[5]={0,0,1,0,-1};
int dy[5]={0,1,0,-1,0};
int n,m,D;
int min(int x,int y)
{
	if(x>y) return y;
	else return x;
}
int main()
{
	freopen("escapea.in","r",stdin);
	freopen("escapea.out","w",stdout);
	scanf("%d%d%d",&n,&m,&D);
	for(int i=1;i<=m;i++)
	 for(int j=1;j<=n;j++)
	 {
	 	char c=getchar();
	 	if(c!='L'&&c!='P') c=getchar();
	 	map[i][j]=c;
	 }
	for(int i=0;i<=m;i++)
	 map[i][0]='L',map[i][n+1]='L';
	for(int j=0;j<=n;j++)
	 map[0][j]='L',map[m+1][j]='L'; 
	memset(f,127/3,sizeof(f));
	f[1][1][0]=0;
	for(int i=1;i<=m;i++)
	 for(int j=1;j<=m;j++)
	  for(int k=0;k<=i+j-2;k++)
	  {
	  	  for(int d=1;d<=4;d++)
	  	  {
	  	  	  int x=i+dx[d],y=j+dy[d];
	  	  	  if(map[x][y]=='P')
	  	  	  {
	  	  	 	  f[x][y][k]=min(f[x][y][k],f[i][j][k]+1);
	  	  	  }
	  	  	  for(int h=k+1;h<=D;h++)
	  	  	   if(map[i+dx[d]*(h-k)][j+dy[d]*(h-k)]=='P')
	  	  	   {
	  	  		  f[i+dx[d]*(h-k)][j+dy[d]*(h-k)][h]=min(f[i+dx[d]*(h-k)][j+dy[d]*(h-k)][h],f[i][j][k]+1);
	  	       }
	  	  }
	  }
	int ans=INF;  
	for(int k=0;k<=D;k++)
	 ans=min(ans,f[m][n][k]);
	printf("%d",ans);  
}