搜索算法小练习

1.前n个自然数的所有排列:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4
 5 using namespace std;
 6
 7 int count=1,n;
 8 bool *b;
 9 int *a;
10
11 void dfs(int);
12
13 int main()
14 {
15     scanf("%d",&n);
16     b=new bool[n+1];
17     a=new int[n+1];
18     memset(b,0,n+1);//这里不能写sizeof(b),b为变量指针
19     dfs(1);
20     return 0;
21 }
22 void dfs(int t)
23 {
24     for(int i=1;i<=n;i++)
25     {
26         if(b[i])    continue;
27         b[i]=1;
28         a[t]=i;
29         if(t==n)
30         {
31             printf("%d ",count++);
32             for(int j=1;j<=n;j++)   printf("%d",a[j]);
33             puts("");
34             b[i]=0;
35             return;
36         }
37         dfs(t+1);
38         b[i]=0;
39     }
40 }

2.迷宫是否有通路(dfs):

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4
 5 using namespace std;
 6
 7 const int N=100;
 8 char mi_gong[N][N];
 9 bool b[N][N];
10 int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
11 int n,m,x1,x2,y1,y2;
12 bool bb;
13
14 void Create();
15 bool CanMove(int x,int y);
16 void Dfs(int x,int y,int step);
17
18 int main()
19 {
20     Create();
21     Dfs(x1,y1,0);
22     if(bb==0)   puts("小老鼠出不来,被憋死了。");
23     return 0;
24 }
25 void Create()
26 {
27     puts("请输入迷宫的行列数以及小老鼠的起点和终点,然后再输入迷宫每个格点,.代表可以走,#代表不可以走。");
28     scanf("%d%d%d%d%d%d",&n,&m,&x1,&y1,&x2,&y2);
29     for(int i=1;i<=n;i++)
30     {
31         getchar();
32         for(int j=1;j<=m;j++)
33         {
34             scanf("%c",&mi_gong[i][j]);
35         }
36     }
37 }
38 bool CanMove(int x,int y)
39 {
40     return x>0&&x<=n&&y>0&&y<=m&&mi_gong[x][y]==‘.‘&&b[x][y]==0;
41 }
42 void Dfs(int x,int y,int step)
43 {
44     if(bb)  return;
45     if(x==x2&&y==y2)
46     {
47         puts("小老鼠可以走出迷宫。");
48         bb=1;
49         return;
50     }
51     int tx,ty;
52     b[x][y]=1;
53     for(int i=0;i<4;i++)
54     {
55         tx=x+dx[i];
56         ty=y+dy[i];
57         if(CanMove(tx,ty))  Dfs(tx,ty,step+1);
58     }
59     b[x][y]=0;
60 }

3.给出n个正整数a1,a2,a3,...,an,和一个正整数k,问是否能从n个数中选出若干个数,使其和为k:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4
 5 using namespace std;
 6
 7 bool ans;
 8 int n,k,*a,*s;
 9 void dfs(int i,int sum);
10
11 int main()
12 {
13     scanf("%d%d",&n,&k);
14     a=new int[n];
15     s=new int[n];
16     for(int i=0;i<n;i++)    scanf("%d",&a[i]);
17     int s0=0;
18     for(int i=n-1;i>=0;i--) s0+=a[i],s[i]=s0;
19     dfs(0,0);
20     if(ans) cout<<"true";
21     return 0;
22 }
23 void dfs(int i,int sum)
24 {
25     if(ans||sum>k||sum+s[i]<k) return;
26     if(i==n)
27     {
28         if(sum==k)  ans=true;
29         return;
30     }
31     dfs(i+1,sum+a[i]);
32     dfs(i+1,sum);
33 }

时间: 2024-10-01 06:10:04

搜索算法小练习的相关文章

[一些基础算法的小心得] -- 二分搜索算法

对分搜索算分也叫二分搜索算法也叫,英文则是binary-search  algorithm.其概念非常的基础,这里不再描述.但问题是我们能否不加思考的写出一个二分搜索算法并一次运行成功呢? 我们知道其核心部分的伪码非常简单(短): 并且我们也知道,对于一个规模为n的已排序数组,任何基于比较的搜索算分所需最坏情况时间为O(n). 那么下面这种算法是否正确呢?如果正确的话,最坏情况时间是什么? 那么下面这种算法呢? 以上三种写法,你能区分出哪种是正确的哪种是不正确的吗,不正确的部分是哪里如何修改呢.

搜索附近的人的搜索算法实现

随着移动终端的普及,很多应用都基于LBS功能,附近的某某(餐馆.银行.妹纸等等). 基础数据中,一般保存了目标位置的经纬度:利用用户提供的经纬度,进行对比,从而获得是否在附近. 目标: 查找附近的XXX,由近到远返回结果,且结果中有与目标点的距离. 针对查找附近的XXX,方案如下: Geohash算法:geohash是一种地址编码,它能把二维的经纬度编码成一维的字符串. 以下是具体实现的例子: 比如,成都永丰立交的编码是wm3yr31d2524 优点: 1.利用一个字段,即可存储经纬度:搜索时,

广度优先、深度优先搜索算法——面试题

广度优先搜索(Breadth-first Search) BFS在求解最短路径或者最短步数上有很多的应用.应用最多的是在走迷宫上. 分析 树的定义本身就是一种递归定义,因此对于树相关的算法题,递归是最好的解决思路(在递归深度允许的情况下). 递归版 public class Solution { public boolean isSymmetric(TreeNode root) { return root==null||isMirror(root.left,root.right); } priv

优化人员应如何应对搜索算法调整

优化人员应如何应对搜索算法调整,三点钟的时候,没等人去叫,阿北自己出现在了会议室的门口.从这点看,他还是保持着一个技术人员的习惯,而不像一个CEO. 不知道为什么,技术出身的阿北,别人谈起来却每每提到说他的一墙碟,两墙书,三大洲的车船票,把他描绘成一个文艺青年,把豆瓣描绘成一个文艺青年聚集地. 文艺也可能是来自商业世界的委婉评语:这家成立十年,拥有过亿用户的网站,一直没有盈利.人们认为豆瓣已经慢了,老了,甚至被移动互联网抛弃了. 阿北说,豆瓣做过尝试,犯过错误,现在找到了新方向. 在2014年的

Cocos2d-x 3.1.1 学习日志16--A星算法(A*搜索算法)学问

A *搜索算法称为A星算法.这是一个在图形平面,路径.求出最低通过成本的算法. 经常使用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上. 首先:1.在Map地图中任取2个点,開始点和结束点 2.首先推断该点是不是不能够穿越的点,或者是已经再close中了 3.假设2步骤为真.什么都不做,假设为假,那么我们就进行加入了 4.假设在加入的时候,发现该点在open中不存在.那么我们直接加入,并且视之为当前节点,假设该点              存在open中,那么我们比較G值,假设发现当

搜索算法比较

搜 索是ACM竞赛中的常见算法,本文的主要内容就是分析它的 特点,以及在实际问题中如何合理的选择搜索方法,提高效率.文章的第一部分首先分析了各种基本的搜索及其各自的特点.第二部分在基本搜索方法的基础上提出 一些更高级的搜索,提高搜索的效率.第三部分将搜索和动态规划结合,高效地解决实际问题,体现搜索的广泛应用性.第四部分总结全文. 文章在分析各种搜索的同时,分析了我们在解题中应该怎样合理利用它,理论结合实际,对我们的解题实践有一定的指导意义. [ Abstract ] Search is a al

grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)

这篇长文历时近两天终于完成了,前两天帮网站翻译一篇文章“为什么GNU grep如此之快?”,里面提及到grep速度快的一个重要原因是使用了Boyer-Moore算法作为字符串搜索算法,兴趣之下就想了解这个算法,发现这个算法一开始还挺难理解的,也许是我理解能力不是很好吧,花了小半天才看懂,看懂了过后就想分享下,因为觉得这个算法真的挺不错的,以前一直以为字符串搜索算法中KMP算很不错的了,没想到还有更好的,Boyer-Moore算法平均要比KMP快3-5倍. 下面是我对该算法的理解,参考了一些关于该

循序与二元搜索算法-java

循序搜索法 就是一个一个去比较,找到时返回: 二元搜索法 二元搜索算法是在排好序的数组中找到特定的元素. 首先, 比较数组中间的元素,如果相同,则返回此元素的指针,表示找到了. 如果不相同, 此函数就会继续搜索其中大小相符的一半,然后继续下去. 如果剩下的数组长度为0, 则表示找不到,那么函数就会结束. 实现代码: package com.zc.manythread; import java.util.Random; import java.util.Scanner; /** * * @auth

搜索算法思考

概述:本文主要讲述一些搜索算法的使用,以及其中奥妙思想的思考. 一:广度搜索与深度搜索---BFS与DFS 1:实现算法导论中的BSF #include <deque> #define MAX 1000000 struct Node { int d; int p; int color; int id; }; int _tmain(int argc, _TCHAR* argv[]) { Node arrNode[8]; int arrGrid[8][8]; deque<Node> q