标签:
| input | output |
|---|---|
3 2 3 1 1 3 2 1 2 |
383 |
//0.156 8 110 KB
#include<stdio.h>
#include<algorithm>
#include<math.h>
#define P sqrt(2)
using namespace std;
double dp[1007][1007];
struct N
{
int x,y;
}p[107];
int cmp(N a,N b)
{
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
n++;m++;
int k;
scanf("%d",&k);
for(int i=0;i<k;i++)
scanf("%d%d",&p[i].x,&p[i].y);
sort(p,p+k,cmp);
dp[1][1]=0;
for(int i=2;i<=n;i++)//初始化第一行
dp[i][1]=dp[i-1][1]+1;
for(int i=2;i<=m;i++)//初始化第一列
dp[1][i]=dp[1][i-1]+1;
for(int i=2;i<=n;i++)
for(int j=2;j<=m;j++)
{
int flag=0;
for(int a=0;a<k;a++)
if(p[a].x==(i-1)&&p[a].y==(j-1))//从三个方向得来
{dp[i][j]=min(dp[i-1][j]+1,min(dp[i][j-1]+1,dp[i-1][j-1]+P));flag=1;break;}
else if(p[a].x>(i-1))break;
if(!flag)dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1);//从两个方向得来
}
printf("%.lf\n",dp[n][m]*100);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/crescent__moon/article/details/42584701