7 条题解

  • 0
    @ 2025-3-15 22:00:05

    一,分析: 一张n*m的地图,有山(不一定联通)和水,求山数量。 二,思路: 1.常规: 访问地图,打上标记。 2,不常规: 进入'#'处('-'处不访问),寻找与它相邻的'#'。所以只要找到没打过标记的'#'答案+1。 如下:

    	for(int i=0;i<n;i++){
    		for(int j=0;j<k;j++){
    			if(map[i][j]=='#'&&vis[i][j]==0){
    				ans++;
    				dfs(i,j);
    			}
    		}
    	}
    

    按上述微微润色一下dfs函数就好了~~

    void dfs(int x,int y){ 
        if(x<0||x>=n||y<0||y>=k||vis[x] 
        [y]1||map[x][y]'-')
            return;
        vis[x][y]=1;
        dfs(x+1,y);
        dfs(x-1,y);
        dfs(x,y+1);
        dfs(x,y-1);
    }
    

    故代码如下:

    #include<iostream>
    using namespace std;
    int n,k;
    char map[110][110];
    int vis[110][110];
    int ans=0;
    void dfs(int x,int y){
    	if(x<0||x>=n||y<0||y>=k||vis[x][y]==1||map[x][y]=='-') return;
    	vis[x][y]=1;
    	dfs(x+1,y);
    	dfs(x-1,y);
    	dfs(x,y+1);
    	dfs(x,y-1);
    }
    int main(){
    	cin>>n>>k;
    	for(int i=0;i<n;i++){
    		for(int j=0;j<k;j++){
    			cin>>map[i][j];
    		}
    	}
    	for(int i=0;i<n;i++){
    		for(int j=0;j<k;j++){
    			if(map[i][j]=='#'&&vis[i][j]==0){
    				ans++;
    				dfs(i,j);
    			}
    		}
    	}
    	cout<<ans;
    	return 0;
    }
    
    

    信息

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