想了很久的der 被自己蠢到了好久
1.数组散列映射关系看眼花了 多映射一层
bool sortRule()里映射错误,明明i,j就是index[]的值还再次映射
2.大脑里没有考虑到点排布特殊情况,出栈操作的while是没有想到的。只考虑与前一点冲突,没有考虑与记载的拟前驱节点群冲突。
#include<iostream>
#include<cmath>
#include<algorithm>
#include<iomanip>
#define epis 1E-8
using namespace std;
typedef struct{
long double x;
long double y;
}Point;
Point point[10010];
int index[10010];
int stack[10010];
int isDir(Point t0,Point t1,Point t2){
long double sum;
sum=t0.x*(t1.y-t2.y)+t1.x*(t2.y-t0.y)+t2.x*(t0.y-t1.y);
if(sum>epis) return 1;
else if(sum<-epis) return -1;
else return 0;
}
long double Dis_sq(Point t0,Point t1){
return sqrt((t0.x-t1.x)*(t0.x-t1.x)+(t0.y-t1.y)*(t0.y-t1.y));
}
bool sortRule(int i,int j){
int dir;
dir=isDir(point[index[0]],point[i],point[j]);
if(dir==-1) return false;
else if(dir==1) return true;
else if(dir==0){
long double dis1,dis2;
dis1=sqrt(Dis_sq(point[index[0]],point[i]));
dis2=sqrt(Dis_sq(point[index[0]],point[j]));
if(dis1-dis2<-epis) return true;
else if(dis1-dis2>epis) return false;
}
}
int main(){
int k,n,i,top;
long double max_,max;
max=0.0;
cin>>n;
for(i=0;i<n;i++){
cin>>point[i].x>>point[i].y;
index[i]=i;
}
for(i=1,k=0;i<n;i++){
if(point[k].y-point[i].y>epis) k=i;
else if(point[k].y-point[i].y<-epis);
else if(point[k].x-point[i].x>epis) k=i;
}
index[0]=k,index[k]=0;
sort(index+1,index+n,sortRule);
top=1;
stack[top]=index[0],stack[++top]=index[1];
for(i=2;i<n;i++){
while(top>1&&isDir(point[stack[top-1]],point[stack[top]],point[index[i]])<=0) top--;
stack[++top]=index[i];
}
for(i=1;i<top;i++){
for(k=i+1;k<=top;k++){
max_=Dis_sq(point[stack[i]],point[stack[k]]);
if(max_-max>epis) max=max_;
}
}
cout<<setiosflags(ios::fixed)<<setprecision(4)<<max<<endl;
for(i=1;i<top;i++) cout<<stack[i]<<" ";
cout<<stack[i];
return 0;
}
总结:堆栈太神奇了,看麻了 小看它了