//此算法和算法导论上的矩阵链乘法的算法一样,稍微有点修改
#include<iostream>
#include<fstream>
#include<cmath>
#include<cstdlib>
using namespace std;
ifstream fin("C:\\data18.in");
char ID[100];
int xpos[100];
int ypos[100];
int n;
float weight[100][100];
int seperatePos[100][100];
float length[100][100];
void Init()
{
char name;
int x,y;
n=0;
while(fin>>name>>x>>y)
{
ID[n]=name;
xpos[n]=x;
ypos[n++]=y;
}
memset(weight,0,sizeof(weight));
memset(length,0,sizeof(length));
}
float circumference(int i,int k,int j)
{
if(i==k||i==j||k==j)
return 0;
float& x1=length[i][k];
float& x2=length[i][j];
float& x3=length[k][j];
if(x1==0)
x1=sqrt((xpos[i]-xpos[k])*(xpos[i]-xpos[k])+(ypos[i]-ypos[k])*(ypos[i]-ypos[k]));
if(x2==0)
x2=sqrt((xpos[i]-xpos[j])*(xpos[i]-xpos[j])+(ypos[i]-ypos[j])*(ypos[i]-ypos[j]));
if(x3==0)
x3=sqrt((xpos[k]-xpos[j])*(xpos[k]-xpos[j])+(ypos[i]-ypos[j])*(ypos[i]-ypos[j]));
return x1+x2+x3;
}
void TRIANGULATION(int i,int j)
{
for(int i=0;i<n;++i)
weight[i][i]=0;
for(int l=2;l<=n;++l)
{
for(int i=0;i<n-l+1;++i)
{
int j=i+l-1;
float p;
for(int k=i+1;k<j;++k)
{
p=weight[i][k]+weight[k][j]+circumference(i,k,j);
if(p>weight[i][j])
{
weight[i][j]=p;
seperatePos[i][j]=k;
}
}
}
}
}
//输出的格式稍微有点问题
void print(int i,int j)
{
int pos=seperatePos[i][j];
if(pos>i)
{
cout<<ID[i]<<"---"<<ID[pos]<<endl;
print(i,pos);
cout<<ID[pos]<<"---"<<ID[j]<<endl;
print(pos,j);
}
}
int main()
{
Init();
TRIANGULATION(0,n-1);
cout<<ID[0]<<"---"<<ID[n-1]<<endl;
print(0,n-1);
system("pause");
return 0;
}
最优三角形剖分
最新推荐文章于 2023-10-24 18:51:56 发布