7 条题解

  • 0
    @ 2025-4-21 19:20:50
     一个蒟蒻 (戴嘉磊) LV 4 @ 1 个月前 
    《群山总数》题解
    这是一题是一个非常简单的DFS求连通块题目 (简单的我都要吐了)
    
    第一步 看题目 题目详情
    
    首先 定义一个105^2^的数组,两个没啥用的dx、dy数组,还有三个变量n、m和sum。
    
    int dx[4] = { 0,0,1,-1 };
    int dy[4] = { 1,-1,0,0 };//两个方向数组
    char c[110][110];//保持地图
    int n, m, sum;//地图的长、宽,连通块的数量
    接下来 先写好用的main函数以及输入
    
    int main() {
      cin >> n >> m;
      for (int i = 1;i <= n;i++)
        for (int j = 1;j <= m;j++)
          cin >> c[i][j];
    }//输入
    紧接着 写普通的循环+🔎连通块+输出
    
      for (int i = 1;i <= n;i++)
        for (int j = 1;j <= m;j++)
      		if (c[i][j] == '#') { 
            sum++;//累加器求和
            c[i][j] = '-';//标记
            dfs(i, j);//函数搜索标记
      }cout << sum << endl;
      return 0;//随手好习惯
    然后 是核心代码————DFS函数
    
    void dfs(int x, int y) {
    	for (int i = 0;i < 4;i++) {
      int nx = x + dx[i], ny = y + dy[i];
    		if (nx > 0 && nx <= n && ny > 0 && ny <= m && c[nx][ny] == '#') {
    			c[nx][ny] = '-';
          dfs(nx, ny);
    		}
    	}
    }
    最后 晒出整个代码
    
    #include <iostream>
    using namespace std;
    int dx[4] = { 0,0,1,-1 };
    int dy[4] = { 1,-1,0,0 };
    char c[110][110];
    int n, m, sum;
    void dfs(int x, int y) {
    	for (int i = 0;i < 4;i++) {
    		int nx = x + dx[i], ny = y + dy[i];
    		if (nx > 0 && nx <= n && ny > 0 && ny <= m && c[nx][ny] == '#') {
    			c[nx][ny] = '-';
    			dfs(nx, ny);
    		}
    	}
    }int main() {
    	cin >> n >> m;
    	for (int i = 1;i <= n;i++)
    		for (int j = 1;j <= m;j++)
    		cin >> c[i][j];
    	for (int i = 1;i <= n;i++)
    		for (int j = 1;j <= m;j++)
    		if (c[i][j] == '#') { 
    		sum++;
    		c[i][j] = '-';
    		dfs(i, j);
    	 }cout << sum << endl;
    	return 0;
    }
    谢谢大家 (麻烦给个👍呗,求求了) 。
    
    
    

    信息

    ID
    2744
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    57
    已通过
    23
    上传者