算法day02

来源:互联网 发布:广州聚焦网络怎么样 编辑:程序博客网 时间:2024/05/18 00:05

算法的第二天,复习一下搜索问题。
1.DFS

void dfs(int step)//step表示站在第几个盒子前{    int i;    if(step==n+1)//如果站在第n+1个盒子面前,则表示前n个盒子已经放好    {        for(i=1;i<=n;i++)            printf("%d ",a[i]);        printf("\n");        return ;//返回前一步(最近一次调用dfs函数的地方)    }    //此时站在第step个盒子面前,应该放哪张牌?    //按照1/2/3/4.。.n的顺序一一尝试    for(i=1;i<=n;i++)    {        //判断扑克牌i是否还在手上        if(book[i]==0)//表示i号扑克牌还在手上        {            //开始尝试使用扑克牌i            a[step]=i;//将i号扑克牌放入盒子中            book[i]=1;//表示扑克牌已经不在手上            //循环递归            dfs(step+1);            book[i]=0;        }    }    return;}

2.给定一些 points 和一个 origin,从 points 中找到 k 个离 origin 最近的点。按照距离由小到大返回。如果两个点有相同距离,则按照x值来排序;若x值也相同,就再按照y值排序。

#include <stdio.h>int a[100];struct node{    int a;    int b;};double dist(int a, int b,int c, int d){    double dis;    dis=(c-a)*(c-a)+(d-b)*(d-b);    return dis;}void quicksort(int left,int right){    int i,j,t,temp;    if(left>right)        return;    i=left;j=right;temp=left;    while(i!=j)    {        while(a[j]>=temp && i<j)            j--;        while(a[i]<=temp && i<j)            i++;        if(i<j)        {            t=a[left];a[left]=temp;temp=t;        }    }     //归准基准数    a[left]=a[i];    a[i]=temp;    quicksort(left,i-1);    quicksort(i+1,right);}int main(){    struct node origin;    struct node points[6];    int k,i;    for(i=1;i<=5;i++)        scanf("%d%d",&points[i].a,&points[i].b);    scanf("%d",&k);    scanf("%d%d",&origin.a,&origin.b);    for(i=1;i<=5;i++)    {        a[i]=dist(origin.a,origin.b,points[i].a,points[i].b);    }    quicksort(1,6);    for(i=1;i<=k;i++)        printf("%d ",a[i]);    return 0;}

明天修改,要断网了。。。