算法學習:深度優先搜索(DFS)

題目描述

南陽理工學院校園裏有一些小河和一些湖泊,如今,咱們把它們通一當作水池,假設有一張咱們學校的某處的地圖,這個地圖上僅標識了此處是不是水池,如今,你的任務來了,請用計算機算出該地圖中共有幾個水池。

輸入

第一行輸入一個整數N,表示共有N組測試數據
每一組數據都是先輸入該地圖的行數m(0<m<100)與列數n(0<n<100),
而後,輸入接下來的m行每行輸入n個數,表示此處有水仍是沒水(1表示此處是水池,0表示此處是地面)

輸出

輸出該地圖中水池的個數。
要注意,每一個水池的旁邊(上下左右四個位置)若是仍是水池的話的話,它們能夠看作是同一個水池。

樣例輸入

2
3 4
1 0 0 0
0 0 1 1
1 1 1 0
5 5
1 1 1 1 0
0 0 1 0 1
0 0 0 0 0
1 1 1 0 0
0 0 1 1 1

樣例輸出

2
3

這題是一道簡單的dfs題目,dfs題,說白了就是暴力搜索的優化版本,屬於不撞南牆不回頭的算法,除非有東西阻擋,否則就會一直往下走,直到走完爲止。c++

這題是求水池數目,咱們能夠用dfs對每一個點的上下左右進行搜索,若是某個點的上下左右(某一個或多個)爲1,則把這個點設置成0,一趟搜索來,咱們能夠把跟這個點鏈接的水池所有標記爲0,而後給計數器變量加1,表明這整個爲1個水池。只要對全部點都進行一遍dfs,則能夠求出全部水池數目。算法

技巧:
①咱們不用二維數組的第一行和第一列,而且將二維數組設置爲num105,這樣既能夠防止數組越界,又能夠用第1和101行已經第1列和101列來做爲外圍邊界。
②初始時將二維數組所有設置爲0,這樣外圍就存在邊界了。
③將數組定義在外部,這樣可使dfs無序傳數組的參數進入。
Coding:數組

#include <bits/stdc++.h>
#define N 105
using namespace std;
int arr[N][N];

void dfs(int a,int b)
{
    if(arr[a-1][b]==1){arr[a-1][b]=0,dfs(a-1,b);}  //向上搜索
    if(arr[a+1][b]==1){arr[a+1][b]=0,dfs(a+1,b);}  //向下搜索
    if(arr[a][b-1]==1){arr[a][b-1]=0,dfs(a,b-1);}  //向左搜索
    if(arr[a][b+1]==1){arr[a][b+1]=0,dfs(a,b+1);}  //向右搜索
}
int main(void)
{
    int t;
    int n,m;
    cin>>t;
    while(t--)
    {
        int cnt=0;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>arr[i][j];

        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                if(arr[i][j]==1)   //表明此點爲水池
                {
                    cnt++;
                    dfs(i,j);     //將與該水池相鄰的水池都標記爲0
                }
            }

            cout<<cnt<<endl;
    }

    return 0;
}
相關文章
相關標籤/搜索