深度優先搜索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;
}
相關文章
相關標籤/搜索