DFS 连通块

将墙包围之外的空地全部填充 额外多填充最外层的一圈
注意条件的判断

洛谷 P1506 拯救oibh总部

#include 

using namespace std;

const int N = 510;

int n,m;
char g[N][N];

int dx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1};

void dfs(int a,int b)
{
    if(a < 0 || a > n + 1 || b < 0 || b > m + 1) return;
    if(g[a][b] == '*') return; // 注意此处条件的判断
    
    g[a][b] = '*';
    
    for(int i = 0;i < 4;i++)
      dfs(a + dx[i],b + dy[i]);
}

int main()
{
    cin >> n >> m;
    
    for(int i = 1;i <= n;i++)    // 另一种读入字符矩阵的方式 
      for(int j = 1;j <= m;j++)
      {
          char c;
          cin >> c;
          g[i][j] = c;
      }
      
    dfs(0,0); // 多填充一层  从(0,0)开始   读入是从(1,1)开始的
    
    int res = 0;
    for(int i = 1;i <= n;i++)
      for(int j = 1;j <= m;j++)
          if(g[i][j] == '0') res++;
          
    cout << res << endl;
    
    return 0;
}

洛谷 P1162 填涂颜色

#include 

using namespace std;

const int N = 35;

int n;
int g[N][N];

int dx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1};

void dfs(int a,int b)
{                                                               
    if(a < 0 || a > n + 1 || b < 0 || b > n + 1) return;
    if(g[a][b] == 1 || g[a][b] == 3) return;  
                    // 注意此处判断  如果省略会发生重复覆盖 最后爆栈
    g[a][b] = 3;
    
    for(int i = 0;i < 4;i++)
      dfs(a + dx[i],b + dy[i]);
} 

int main()
{
    cin >> n;
    
    for(int i = 1;i <= n;i++)
      for(int j = 1;j <= n;j++)
          cin >> g[i][j];
      
    dfs(0,0); // 与上面相同 也是从外层(0,0)开始
    
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= n;j++)
        {
            if(g[i][j] == 3) cout << 0 << ' ';
            else if(g[i][j] == 0) cout << 2 << ' ';
            else cout << 1 << ' ';
        }
        puts("");
    }
      
    return 0;
}

你可能感兴趣的:(蓝桥杯,算法,c++)