dp,感觉用bfs也能做,可是一直错。。。
好不容易ac了,新学到了一种四舍五入的方法,以前一直不会用的,所以记录下来
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define INF 200000000
int dis[1005][1005],dui[1005][1005],queue[100001][2];
double judge(int a)
{
if(a%10>=5)
return 0.5;
else
return 0;
}
int main()
{
int n,m,i,j,k,l,a,b,kk,begin,end,x,y;
while(scanf("%d%d",&n,&m)!=EOF)
{
scanf("%d",&kk);
memset(dis,-1,sizeof(dis));
dis[0][0]=0;
memset(dui,0,sizeof(dui));
for(i=1;i<=kk;i++)
{
scanf("%d%d",&a,&b);
dui[a-1][b-1]=1;
}
begin=0;end=1;
queue[0][0]=0;
queue[0][1]=0;
while(begin!=end)
{
x=queue[begin][0];
y=queue[begin][1];
begin++;
if(y+1<=m&&dis[x][y+1]==-1)
{
dis[x][y+1]=dis[x][y]+1;
queue[end][0]=x;
queue[end][1]=y+1;
end++;
}
if(x+1<=n&&dis[x+1][y]==-1)
{
dis[x+1][y]=dis[x][y]+1;
queue[end][0]=x+1;
queue[end][1]=y;
end++;
}
if(x+1<=n&&y+1<=m&&dui[x][y]==1&&dis[x+1][y+1]==-1)
{
dis[x+1][y+1]=dis[x][y]+1;
queue[end][0]=x+1;
queue[end][1]=y+1;
end++;
}
}
printf("%.0lf\n",(2*dis[n][m]-n-m)*100+(n+m-dis[n][m])*sqrt(2.0)*100+judge((n+m-dis[n][m])*sqrt(2.0)*1000));
}
return 0;
}