算法的第二天,复习一下搜索问题。
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;
}
明天修改,要断网了。。。