深度优先搜索DFS,求解部分和问题及poj2386水洼问题

深度优先搜索(DFS)是搜索的手段之一。它从某个状态开始,不断地转移状态直到没法转移,而后回退到前一步的状态,继续转移到其余状态,如此不断重复,直至找到最终的解。ios

 

部分和问题:数组

给定整数a一、a二、...、an,判断是否能够从中选出若干数,使它们的和刚好为k。spa

 

分析:code

从a1开始按顺序决定每一个数加或不加,在所有n个数都决定后再判断它们的和是否是k便可。由于状态数是2n+1(每一个数都有加和不加两种状况),因此复杂度是O(2n)。blog

代码以下:ci

/*
题目描述:可否找到数组a中的元素相加之和等于指定的数k
解决方法:深度优先搜索(dfs)对每一个元素组合进行遍历 
*/
#include<iostream>
using namespace std;
int a[100],k,n;

//已经从前i项获得了和sum,而后对于i项以后的进行分支 
bool dfs(int i,int sum){
    //若是前n项都计算过了,则返回sum是否与k相等 
    if(i==n) return sum == k;
    //不加上a[i]的状况 
    if(dfs(i+1,sum)) return true;
    //加上a[i]的状况 
    if(dfs(i+1,sum+a[i])) return true;
    //加不加a[i],都被没法与k相等,则返回false 
    return false;
} 

int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    cin>>k;
    if(dfs(0,0)){
        cout<<"Yes"<<endl;
    }else{
        cout<<"No"<<endl;
    }
    return 0;
} 

 部分和问题是DFS的基本题,如今咱们稍微深刻,求解poj2386,水洼问题string

题目描述:io

给定一个矩阵(m*n),其中W表示有水,. 表示干地,现给出定义在W周围(包括该W)的8个坐标位置(上下左右,左上左下右上右下)有W存在则造成水洼(水洼具备传递性),求这个矩阵中有多少个水洼?class

样例输入:stream

10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.

样例输出:

3

 

分析:可从任一个W开始,断定周围是否存在W,进行深搜,并将遍历到的W都改成.,那么最后进行深搜的次数即是水洼的个数。

#include<iostream>
#include<cstring>
using namespace std;
int m,n;
char pool[101][101];//题中矩阵 

void dfs(int x,int y){
    //首先将其改成干地 
    pool[x][y]='.';
    //对每一个方向进行遍历 
    for(int i=-1;i<=1;i++){
        for(int j=-1;j<=1;j++){
            int nx=x+i,ny=y+j;
            //若为'W',则沿着继续搜索 
            if(nx>=0&&ny>=0&&nx<m&&ny<n&&pool[nx][ny]=='W'){
                dfs(nx,ny);
            }
        }
    }
} 

int find(){
    int count = 0;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            //遍历整个矩阵,若为'W',启动深搜,并计数 
            if(pool[i][j]=='W'){
                dfs(i,j);
                count++;
            }
        }
    }
    return count;
}

int main(){
    cin>>m>>n;
    for(int i=0;i<m;i++){
        cin>>pool[i];
    }
    cout<<find()<<endl;
    return 0;
}
相关文章
相关标签/搜索