个人笔记:算法讲座1.1——点和线

本文仅供参考学习使用,谢谢

目录:

    • 问题描述:
    • 算法思想:
    • 测试数据:
    • 代码:

问题描述:

Alice在纸上划了若干个点,要Bob把这些点连在一起(没有要求
连成一条直线),问,Bob要怎样连,连线长度之和最短

  • 输入:

第一行是点的数目,以后每行是每个点的坐标

  • 输出:

最短连线长度(保留小数点后两位)

算法思想:

个人笔记:算法讲座1.1——点和线_第1张图片
(方法比较蠢,没有使用循环队列,别看右上角)

测试数据:

  • 数据1:

3
0 0
0 1
1 1

  • 结果1:

2.00

  • 数据2:

5
0 0
0 2
1 1
2 2
2 3

  • 结果2:

5.24

代码:

#include 
#include 
#include 
#define maxsize 10
#define max 100

typedef struct Node{
    int x;
    int y;
}Node;

typedef struct{
    Node l[maxsize];
    int visited[maxsize];//标记0未读 1已读
    int num;
    double sum;
}Nodelist;

double calculate(Node A,Node B){//计算出A B两点之间的距离
    double end=0;
    end=pow((pow((A.x-B.x), 2))+(pow((A.y-B.y), 2)), 0.5);
    return end;
}

int choose(Node A,Nodelist list){//计算出与A点距离最近的点的下标 且该点未被访问
    double min=0,x = 0;
    int number=-1;
    for (int i=0; i<list.num; i++) {
        if (list.visited[i]==0) {
            x = calculate(A, list.l[i]);
            if (min==0) {
                min=x;
                number=i;
            } else {
                if (x<min) {
                    min=x;
                    number=i;
                }
            }
        }
    }
//    printf("%d\n",number);
    return number;
}

Nodelist once_sure(Nodelist list){//计算出一整次选择后选出的新边的长度 并把新入的点标为1
    int numb = 0,new = 0;
    double min = 0,x = 0;
    for (int i=0; i<list.num; i++) {
        if (list.visited[i]==1) {
            numb = choose(list.l[i], list);//和已经标为1的点 距离最近的 点的下标
            x = calculate(list.l[i], list.l[numb]);//选择出的这两个点的距离
            if (min==0) {
                min=x;
                new=numb;
            } else {
                if (x<min) {
                    min=x;
                    new=numb;
                }
            }
        }
    }
    list.visited[new]=1;
    list.sum+=min;
    return list;
}

int main(){
//    double sum=0;
    Nodelist list;
    list.sum=0;
//    printf("有几个顶点:");
    scanf("%d",&list.num);
//    printf("输入每个点的坐标:\n");
    for (int i=0; i<list.num; i++) {
        scanf("%d%d",&list.l[i].x,&list.l[i].y);
        list.visited[i]=0;
    }
    
    list.visited[0]=1;
    for (int i=0; i<list.num-1; i++) {
        list=once_sure(list);
    }
    
    printf("%.2f\n",list.sum);
    return 0;
}

你可能感兴趣的:(个人笔记:算法讲座,算法)