题意:给出一条直线 ax +by+c=0 给出两个整点 (x1,y1) (x2,y2) 只有在x,y坐标至少有一个整点的时 以及 给出的直线才有路径(也就是格子坐标图的线上)
问 两个整点所需要经过的最短距离
思路: 整点和整点之间的最短路径 要么 经过 直线 要么不经过直线 如果不经过直线,那么最短距离就是两者的曼哈顿距离 |x1-x2|+|y1-y2|
如果经过线段 那么一个点有两种到线段的方式 一种是和线段上的点x 相同 一个是和线段上的点y相同 2*2一共四种情况 全部算一遍取最小即可
还要考虑斜率等于0以及直线垂直x轴的情况
#include<bits/stdc++.h>
#define F first
#define S second
#define pii pair<int,int>
#define pb push_back
#define mkp make_pair
#define all(zzz) (zzz).being(),(zzz).end()
typedef long long ll;
using namespace std;
const int maxn=1e5+;
double dist(double x1,double y1,double x2,double y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main(){
ll a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
ll x1,y1,x2,y2;
scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);
double ans=abs(x2-x1)+abs(y2-y1);
if(a!=&&b!=){
double x3=x1;
double y3=1.0*(-c-a*x1)/b;
double y4=y1;
double x4=1.0*(-c-b*y1)/a;
double x5=x2;
double y5=1.0*(-c-a*x2)/b;
double y6=y2;
double x6=1.0*(-c-b*y2)/a;
ans=min(dist(x3,y3,x5,y5)+abs(y3-y1)+abs(y5-y2),ans);
ans=min(dist(x4,y4,x5,y5)+abs(x4-x1)+abs(y5-y2),ans);
ans=min(dist(x3,y3,x6,y6)+abs(y3-y1)+abs(x6-x2),ans);
ans=min(dist(x4,y4,x6,y6)+abs(x4-x1)+abs(x6-x2),ans);
}
else if(a==&&b!=){
ans=min(ans,dist(x1,-c/b,x2,-c/b)+abs(-c/b-y1)+abs(-c/b-y2));
}
else if(a!=&&b==){
ans=min(ans,dist(-c/a,y1,-c/a,y2)+abs(-c/a-x1)+abs(-c/a-x2));
}
printf("%.10lf\n",ans);
return ;
}