一、dfs(深度优先搜索) (时间复杂度为O(!n)。)
为得到问题的解,先选择一种有可能的情况向前搜索,在这过程中,一旦发现原来选择是错的,就退一步重新选择,继续向前。如此反复尝试,直到得到解或无解
求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(广度优先搜索)
从图的根节点开始,沿着根节点邻接点一层一层向下寻找,直到找到目标为止。
类似树的层次遍历过程(一般用于最短路径优先)
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