美文网首页
2.1 最基础的“穷竭搜索”

2.1 最基础的“穷竭搜索”

作者: Nathanpro | 来源:发表于2015-04-03 20:13 被阅读0次
  • 递归函数
  • 队列
  • 深度优先搜索
  • 宽度优先搜索

2.1.1 递归函数

在一个函数中再次调用该函数本身的行为叫做递归,这样的函数被称为递归函数。
1)阶乘函数 int fact(int n)

int fact(int n){
    if(n==1) return 1;
    return fact(n-1)\*n;
}

注意:0!=1,n!=(n-1)!×n。

2)斐波那契数列 int fib(int n)

int fib(int n){
    if(n<=1){
        return n;
    }
    return fib(n-1)+fib(n-2);
}

注意:指的是这样一个数列:0、1、1、2、3、5、8、13、21、…
F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2) (n≥2,n∈N*)

2.1.2 栈

Stack是支持pushpop两种操作的数据结构。实现的是一种LIFO策略。

2.1.3 队列

Queue是支持pushpop两种操作的数据结构。实现的是一种FIFO策略。

2.1.4 深度优先搜索(DFS)

DFS从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直至找到最终的解。

1)部分和问题
<pre><code>给定整数a1、a2、…an,判断是否可以从中选出若干数,使它们的和为k。
限制条件

  1. 1 ≤ n ≤ 20
  2. -10^8 ≤ ai ≤ 10^8
  3. -10^8 ≤ k ≤ 10^8

样例1:
输入:
n = 4;
a = {1,2,4,7};
k = 13
输出:Yes

样例2:
输入:
n = 4
a = {1,2,4,7}
k=15
输出:NO


状态转移的顺序

//
// Created by Nathan on 15/3/21.
// Copyright (c) 2015年 Nathan. All rights reserved.
//

include <iostream>

using namespace std;
int n,k;
const int MAX = 100000000;
int a[MAX];
int solve(int res ,int i ){
if(i==n) return res==k;
if(solve(res+a[i],i+1)) return true;
if(solve(res,i+1)) return true;
return false;
}
int main(int argc, const char * argv[]) {
cin >> n >> k;
for (int i = 0; i<n; i++) {
cin >> a[i];
}
if(solve(0,0)){
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
return 0;
}</code></pre>
2)Laking Counting
<pre><code>
计算出园子里总共有多少水洼?八连通的积水被认为是连接在一起的。
输入:
N=10 , M=12
园子如下如:
W . . . . . . . . W W .
. W W W . . . . . W W W
. . . . W W . . . W W .
. . . . . . . . . W W .
. . . . . . . . . W . .
. . W . . . . . . W . .
. W . W . . . . . W W .
W . W . W . . . . . W .
. W . W . . . . . . W .
. . W . . . . . . . W .
代码如下:
//
// Created by Nathan on 15/3/21.
// Copyright (c) 2015年 Nathan. All rights reserved.
//

include <iostream>

using namespace std;
const int MAX=100;
char field[MAX][MAX];
int M,N;
void dfs(int x,int y){
field[x][y]='.';
for (int dx =-1; dx <= 1; dx++) {
for (int dy =-1; dy <= 1; dy++) {
int nx = dx+x;
int ny = dy+y;
if(field[nx][ny]=='W' && 0<=nx && nx < N && 0<= ny && ny<M) dfs(nx,ny);
}
}
}
int main(int argc, const char * argv[]) {
cin >> N >> M;
for (int i= 0; i<N; i++) {
for (int j = 0; j<M; j++) {
cin >> field[i][j];
}
}
int res = 0;
for (int i = 0; i<N; i++) {
for (int j =0; j<M; j++) {
if(field[i][j]=='W'){
dfs(i,j);
++res;
}
}
}
cout << res << endl;
return 0;
}
</code></pre>

2.1.5 宽度优先搜索(BFS)

1)迷宫最短路径
<pre><code>
输入:
N,M = 10;

S # # # # # # .

. . . . . . # . . #
. # . # # . # # . #
. # . . . . . . . .

# . # # . # # #

. . . . # . . . . #
. # # # # # # # . #
. . . . # . . . . .
. # # # # . # # # .
. . . . # . . . G #
sx = 0; sy = 1;
gx = 9; gy = 8;
输出:22
//
// Created by Nathan on 15/3/21.
// Copyright (c) 2015年 Nathan. All rights reserved.
//

include <iostream>

include <queue>

using namespace std;
typedef pair<int,int>P;
queue<P>que;
const int MAX = 100;
const int INF = 10000;
char field[MAX][MAX];
int d[MAX][MAX];
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
int N,M;
int sx,sy;
int gx,gy;
int bfs(){
for (int i = 0 ; i<N; i++) {
for (int j = 0; j<M; j++) {
d[i][j] = INF;
}
}
que.push(P(sx,sy));
d[sx][sy]=0;
while (que.size()) {
P q = que.front();
que.pop();
if(q.first==gx && q.second==gy) break;
for (int i = 0; i<4; i++) {
int nx = dx[i]+q.first;
int ny = dy[i]+q.second;
if(0<=nx && nx<N && 0<=ny && ny<M && field[nx][ny]!='#' && d[nx][ny]==INF){
d[nx][ny] = d[q.first][q.second]+1;
que.push(P(nx,ny));
}
}
}
return d[gx][gy];
}
int main(int argc, const char * argv[]) {
cin >> sx >> sy;
cin >> gx >> gy;
cin >> N >> M;
for (int i = 0 ; i<N; i++) {
for (int j=0; j<M; j++) {
cin >> field[i][j];
}
}
int res = bfs();
cout << res << endl;
return 0;
}</code></pre>

相关文章

  • 2.1 最基础的“穷竭搜索”

    递归函数 栈 队列 深度优先搜索 宽度优先搜索 2.1.1 递归函数 在一个函数中再次调用该函数本身的行为叫做递归...

  • 最基础的"穷竭搜索"

    穷竭搜索是将所有的可能性罗列出来,在其中寻找答案的方法。主要有深度优先搜索和广度优先搜索这两种方法 1.递归函数 ...

  • 穷竭搜索

    DFS POJ 1979: Red and Black简单的DFS找四联通块即可。代码如下 POJ 3009: C...

  • 数据结构与算法-二叉搜索树

    1. 基础数据结构 2. 树的增删查 2.1 搜索 因为插入前要搜索是否存在,所以先实现搜索。 2.1 插入 2....

  • 学习总结day1——LA

    1. 自学生信搜索方式 微信搜索,谷歌,知乎,CSDN 2. linux的用法 2.1 Linux的基础语法 1 ...

  • 穷竭

    穷竭,很是喜欢这个词。 穷竭,穷尽全力,枯竭尽头。正如我们常说的,置之死地而后生,凤凰涅槃。穷竭处,才是扭转乾坤的...

  • Vim速成 - 第4节 搜索

    第4节 搜索 基础 / /斜杠是最基础的搜索操作。在/后输入你要搜索的文字,然后按下回车。作为一个"动作",你可以...

  • Poj1852(Ants)

    题目分析: 首先很容易想到一个穷竭搜索(暴搜)算法,即枚举所有蚂蚁的初始朝向的组合,这可以利用递归函数实现。每只蚂...

  • 数据结构与算法基础十一:查找

    一:概论 查找,或搜索(Search),是最频繁的操作,基础中的基础. 查找表(search table):也就是...

  • 2 信息收集

    Contents: [2.1. 域名信息][2.1.1. Whois][2.1.2. 搜索引擎搜索][2.1.3....

网友评论

      本文标题:2.1 最基础的“穷竭搜索”

      本文链接:https://www.haomeiwen.com/subject/dmcaxttx.html