程序大意:在三维直角坐标戏中(Z值为0,相当于二维),先定义一个class1以个一个点为中心,以某个值为“半径d”,第二个点与第一个点的距离D21小于“半径d”,则第二个点属于class1,如果距离大于“半径d”则产生新的class2,并以第二个点为中心,“半径”仍为“d”,第三个点与第一、二个点距离为D31、D32,D31和D32同时大于“半径d”的话则产生新的class3以第三点为中心,否则第三点属于距离较近的点所在的class,例如,如果D31小于D32小于“半径d”则第三点属于class1,依次下去20个点,最后表现出各个class的中心是哪些点,并表示出20个点各属于哪个class。
#include "stdio.h"
#include "math.h"
int x[20][3] = {{ 3, 1, 0},
{ 1, 4, 0},
{ 2, 5, 0},
{ 2, 2, 0},
{ 3, 3, 0},
{110, 98, 0},
{100,100, 0},
{ 96,112, 0},
{ 99, 99, 0},
{105,110, 0},
{ 6,101, 0},
{ 1, 94, 0},
{ 7, 95, 0},
{ 2,102, 0},
{ 114, 93, 0},
{101, 1, 0},
{ 99, 4, 0},
{ 98, 7, 0},
{ 95, 15, 0},
{103, 113, 0}};
float distance(int a,int b)
{
float d;
d=sqrt((x[b][0]-x[a][0])*(x[b][0]-x[a][0])+(x[b][1]-x[a][1])*(x[b][1]-x[a][1]));
return d;
}
void main()
{
int i,j,m,n=1;
float d,min;
printf("Please input d:");
scanf("%f",&d);
printf("\n");
x[0][2]=20+n++; // 最后一位[2]作为标志位,大于20为class!
for(i=1;i<20;i++)
{
min=d;m=i;
for(j=0;j<i;j++)
if(x[j][2]>20 && min>distance(j,i))
{min=distance(j,i);m=j;}
if(min==d)
x[i][2]=20+n++;
else
x[i][2]=x[m][2]-20;
}
for(i=0;i<20;i++)
if(x[i][2]>20)
printf("Cluster center%2d = X[%2d][] = {%3d,%3d,0}\n",x[i][2]-20,i,x[i][0],x[i][1]);
printf("\n");
for(i=0;i<20;i++)
if(x[i][2]<20)
printf("X[%2d][] = {%3d,%3d,0} = Cluster %2d \n",i,x[i][0],x[i][1],x[i][2]);
}