第八周学习总结

一、dfs(深度优先搜索)               时间复杂度为O(!n)。

  1. 基本思想

为得到问题的解,先选择一种有可能的情况向前搜索,在这过程中,一旦发现原来选择是错的,就退一步重新选择,继续向前。如此反复尝试,直到得到解或无解

  1. 例题

求n个整数的集合{1,2,3….n},从中取出r个数进行排序,列出所有排列

代码:

#include
int a[510];	//存储每次选出的数据
int book[510];	//标记是否被访问
int ans=0,k,n; 	//记录符合条件的次数
void dfs(int cur)
{
	if(cur==k)			//k个数被选完,输出
	{
		for(int i=0;i

二、bfs(广度优先搜索)

  1. 算法思路(队列)(先进先出)

从图的根节点开始,沿着根节点邻接点一层一层向下寻找,直到找到目标为止。        

类似树的层次遍历过程(一般用于最短路径优先)

  1. 例题

c大楼有一个一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第 i 层楼 (1≤i≤N) 上有一个数字Ki(0≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3,3,1,2,5 代表了Ki (K1=3,K2=3,…),在1楼,按“上”可以到4楼,按“下”是不起作用的,因为没有−2楼。那么,从A楼到B楼至少要按几次按钮呢?

输入格式:

第一行包含3个用空格隔开的正整数,分别表示N,A,B (1≤N≤200,1≤A,B≤N) 。 第二行包含N 个用空格隔开的非负整数,表示Ki 。

输出格式:

输出共一行,即最少按键次数,若无法到达,则输出 −1 。

输入样例:

5 1 5

3 3 1 2 5

输出样例:

3

#include
int judge(int a[],int n)  //判断是否每层楼都去过了
{
    int i=0;
    for(i=1; i0)
                    que[h++]=que[l]-a[que[l]];
                a[que[l]]=0;                //标记访问过的楼层
            }
            l++;
            }
                count++;
                for(int i=0;i

三、快速排序

1、基本思想

通过一趟排序,定一个标记点,将待排序记录分割成独立的两部分,一半大于标记点的,一半小于标记点的

2、例题

对多组输入的数据进行排序

void fastsort(int a[],int l,int r)
{
    if(l>r) return;
    int temp=a[l],i,j;
    i=l,j=r;
    while(i!=j)
    {
        while(i=temp)
        {
            j--;
        }
        while(ii)
        {
            int t;
            t=a[j];
            a[j]=a[i];
            a[i]=t;
        }
    }
    a[l]=a[i];
    a[i]=temp;
    fastsort(a,l,i-1);
    fastsort(a,i+1,r);
}
int main()
{
    int t,n,a[1000],i,j;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=0;i

你可能感兴趣的:(学习)