发布网友 发布时间:2022-04-22 00:54
共2个回答
热心网友 时间:2023-07-03 03:01
#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()
{
//这个程序是把类的编号放在坐标的第三维,因为坐标的第三维均为0没有用,所以正好利用起来。
//对类的编号从1开始编号,如果类的编号为i(i=1,2,3...),则类中心点的坐标第3维对应存储的数据为20+i。
//对非类中心点的点,其存储的是对应所属类的编号。
//因此,最后打印的时候,根据第3维的数据是否大于20可以判断是否是类的中心点。
int i,j,m,n=1;
float d,min;
printf("Please input d:"); //输入半径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)) //x[j][2]>20表明x[j]为class的中心,min>distance(j,i)表明i和j的距离比原先的距离还要小。
//此句的目的是把i这个点与原先已经计算出来的class中心分别计算距离,并保存距离的最小值到变量min中,其对应class中心点编号放到m中
{
min=distance(j,i);m=j;
}
if(min==d) //如果此式成立,表明最小距离都比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]);
}
热心网友 时间:2023-07-03 03:01
这题目也问?
认真看看
对基础帮助很大的