?? 1292 will indiana jones get there.cpp
字號:
#include<iostream.h>
#include<math.h>
#include<iomanip.h>
struct point// 一個(gè)點(diǎn)
{
int x,y;
};
struct
{
point begin,end;
int sign;
}edge[1000];//一條邊
double calculate(point a,point b) //計(jì)算兩個(gè)點(diǎn)之間的距離
{
return (sqrt((a.x-b.x+0.0)*1.0*(a.x-b.x)+(a.y-b.y+0.0)*1.0*(a.y-b.y)));
}
double distance(int i,int last)//計(jì)算兩條線之間的距離
{
int erect,flat;
double between;
if(edge[i].sign==edge[last].sign)
{
if(edge[i].sign==1) //兩條線段都是水平的
{
if(edge[i].end.x<edge[last].begin.x) between=calculate(edge[i].end,edge[last].begin);
else if(edge[i].begin.x>edge[last].end.x) between=calculate(edge[i].begin,edge[last].end);
else between=fabs(edge[i].begin.y-edge[last].begin.y);
}
else //兩條線段都是豎直的
{
if(edge[i].begin.y>edge[last].end.y) between=calculate(edge[i].begin,edge[last].end);
else if(edge[i].end.y<edge[last].begin.y) between=calculate(edge[i].end,edge[last].begin);
else between=fabs(edge[i].begin.x-edge[last].begin.x);
}
}
else
{
if(edge[i].sign==1) {erect=last;flat=i;}
else {erect=i;flat=last;} //erect 記錄豎線,flat記錄橫線
if(edge[erect].end.x<edge[flat].begin.x) //圖4,5,6中,豎線均在橫線的左側(cè)。
{
if(edge[erect].begin.y>edge[flat].begin.y)
between=calculate(edge[erect].begin,edge[flat].begin);
else if(edge[erect].end.y<edge[flat].begin.y)
between=calculate(edge[erect].end,edge[flat].begin);
else between=fabs(edge[erect].begin.x-edge[flat].begin.x);
}
else if(edge[erect].begin.x>edge[flat].end.x)//圖7,8,9中,豎線均在橫線的右側(cè)
{
if(edge[erect].begin.y>edge[flat].begin.y)
between=calculate(edge[erect].begin,edge[flat].end);
else if(edge[erect].end.y<edge[flat].begin.y)
between=calculate(edge[erect].end,edge[flat].end);
else between=fabs(edge[erect].begin.x-edge[flat].end.x);
}
else //圖10,圖11,圖12中,豎線的x坐標(biāo)介于橫線兩端的x坐標(biāo)之間
{
if(edge[erect].begin.y>edge[flat].begin.y)
between=fabs(edge[erect].begin.y-edge[flat].begin.y);
else if(edge[erect].end.y<edge[flat].begin.y)
between=fabs(edge[erect].end.y-edge[flat].begin.y);
else between=0;
}
}
return between;
}
void main()
{
int i,n,l,min,used[1000],last;
double between,weight[1000];
cin>>n;
while(n>0)
{
for(i=0;i<n;i++)//初始化,記錄各條邊
{
cin>>edge[i].begin.x>>edge[i].begin.y>>l;
if(l>0)
{
edge[i].end.x=edge[i].begin.x+l;
edge[i].end.y=edge[i].begin.y;
edge[i].sign=1;//1 表示weihengxian
}
else
{
edge[i].end.x=edge[i].begin.x;
edge[i].end.y=edge[i].begin.y-l;
edge[i].sign=-1;// -1 表示為豎線
}
}
for(i=0;i<n;i++)
{
weight[i]=9999999;
used[i]=0;// 0 表示未被標(biāo)記過
}
last=0;
used[0]=1;//標(biāo)記起始點(diǎn)已被選過
weight[0]=0;//起始線所代表的點(diǎn)權(quán)值為0
while(last!=1)//只要last不為目標(biāo)點(diǎn)
{
for(i=0;i<n;i++)
if(used[i]==0)//如果i未被標(biāo)記過
{
between=distance(i,last);//求i到last的距離
if(weight[last]>between) between=weight[last];
if((weight[i]-between)>1e-10) weight[i]=between;
}
//從未被標(biāo)記的點(diǎn)中選出權(quán)值最小的點(diǎn)
i=0;
while(used[i]==1) i++;
min=i;
for(i;i<n;i++)
if((used[i]==0)&&((weight[min]-weight[i])>1e-10))
min=i;
last=min;
used[min]=1;
}
cout<<setiosflags(ios::fixed)<<setprecision(2)<<weight[1]<<endl;
cin>>n;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -