7 条题解

  • 0
    @ 2025-4-21 19:19:51
    using namespace std;
    int n,m,ans;
    char a[105][105];
    bool vis[105][105];
    int dx[4]={-1,1,0,0};
    int dy[4]={0,0,-1,1};
    void dfs(int x,int y){
    	for(int i=0;i<4;i++){
    		int xx=x+dx[i];
    		int yy=y+dy[i];
    		if(xx>=0&&yy>=0&&xx<n&&yy<m&&vis[xx][yy]==false&&a[xx][yy]=='#'){
    			vis[xx][yy]=true;
    			dfs(xx,yy);
    		}
    	}
    }
    int main(){
    	cin>>n>>m;
    	for(int i=0;i<n;i++){	
    		for(int j=0;j<m;j++){
    			cin>>a[i][j];
    		}
    	}
    	for(int i=0;i<n;i++){
    		for(int j=0;j<m;j++){
    			if(a[i][j]=='#'&&vis[i][j]==false){
    				vis[i][j]=true;
    				dfs(i,j);
    				ans++;
    			}
    		}
    	}
    	cout<<ans;
    	return 0;
    }
    
    

    一个蒟蒻 (戴嘉磊) 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 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
    上传者