小明练功的梅花桩排列成 n 行 m 列,相邻两行的距离为 1,相邻两列的距离也为 1。
小明站在第 1 行第 1 列上,他要走到第 n 行第 m 列上。小明已经练了一段时间,他现在可以一步移动不超过 d 的距离(直线距离)。
小明想知道,在不掉下梅花桩的情况下,自己最少要多少步可以移动到目标。
输入 n,m,d,输出答案。
My Code:
#include<bits/stdc++.h>
using namespace std;
const int N=1003;
int n,m,dp[N][N];
double d;
double Getdis(int a,int b,int c,int d){
return sqrt(1.0*abs(a-c)*abs(a-c)+1.0*abs(b-d)*abs(b-d));
}
int main(){
cin>>n>>m>>d;
n--,m--;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i==1&&j==1) continue;
int ans=1e9;
for(int x=i;x>=i-(int)d;x--){
if(x<1) break;
for(int y=j;y>=j-(int)d;y--){
if(x==i&&y==j) continue;
if(y<1) break;
if(Getdis(i,j,x,y)>d) break;
ans=min(dp[x][y],ans);
}
}
dp[i][j]=ans+1;
}
}
cout<<dp[n][m];
return 0;
}