1. 程式人生 > >最優三角形剖分

最優三角形剖分

//此演算法和演算法導論上的矩陣鏈乘法的演算法一樣,稍微有點修改
#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;
}