## L2-048 寻宝图

题目链接：
https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=1649748772841508875&page=1

**题目分析：
本题和leetcode上的岛屿问题很像，是一样的解题思路。我们可以用dfs算法，当我们找到一个岛屿时，我们dfs遍历，看有没有宝藏，同时把岛屿淹了（赋值为0），这样可以不走回头路
具体看代码吧！**

```cpp
#include<bits/stdc++.h>
using namespace std;
bool dfs(vector<vector<int>>& grid,int i,int j){
    int m=grid.size();int n=grid[0].size();
    if(i<0 || j<0 || i>=m || j>=n){
        return false;;
    }
    if(grid[i][j]==0){
        return false;
    }
    bool has_treasure=false;
    if(grid[i][j]!=1){
        has_treasure=true;
    }
    grid[i][j]=0;
    has_treasure|=dfs(grid,i+1,j);
    has_treasure|=dfs(grid,i-1,j);
    has_treasure|=dfs(grid,i,j+1);
    has_treasure|=dfs(grid,i,j-1);
    return has_treasure;
}
int main(){
    int n,m;
    cin>>n>>m;
    //这里有一个很大的坑点，就是输入的数字不是空格分隔的，所以读入的时候会把它看作一个整体读入,可以用字符串读入
    vector<vector<int>>grid(n,vector<int>(m));
    string line;
    for(int i=0;i<n;i++){
        cin>>line;
        for(int j=0;j<m;j++){
            grid[i][j]=line[j]-'0';
        }
    }
    int res=0; int treasure=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(grid[i][j]!=0){
                res++;
                if(dfs(grid,i,j)){
                    treasure++;
                }
            }
        }
    }
    cout<<res<<" "<<treasure;
    return 0;
}
