7 条题解

  • 1
    @ 2025-3-9 12:50:07

    先阅读题目:题目出现两个变量N,M,还有一个char类型的沙盘a,另外还有一个答案(山的数量)ans。 因为是深搜题,还需要三个变量:vis,dx,dx,vis由于记录点是否被访问,dx和dy用于深搜时x,y方向的增减。

    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};
    

    接下来编主函数 首先要按题目要求输入n,m,a

    cin>>n>>m;
    for(int i=0;i<n;i++){	
        for(int j=0;j<m;j++){
            cin>>a[i][j];
        }
    }
    

    (至于为啥不把dfs放输入里,自己试试看就知道了) 接下来遍历一遍a,找出一座山(一定要是没被访问过的山)并把它标记为被访问过就可以进深搜函数了(这里先不讲深搜)把一座山深搜完,应增加ans,表示发现了一座山。

    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++;
            }
        }
    }
    

    好了,现在还有输出,题目要求输出山的数量就是输出ans

    cout<<ans;
    

    这样子主函数就差不多了 主函数:

    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;
    }
    

    接下来是深搜(我喜欢用void,这个根据个人喜好决定,不同的当然要作相应修改),定义x,y作当前节点的坐标 首先,因为没有终点,所以不写if和return,深搜完就直接退出,先写一个for,用来搜索四面的节点,这里要临时定义xx=dx[i]+x,yy=dy[i]+y,用来保存四面节点,然后判断节点是否满足以下四个条件: 1.不出界; 2.没有被标记; 3.是山; 满足了就可以从xx,yy继续深搜(注意vis)。 这样dfs就编完了,注意要把它放在主函数前。

    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);
    		}
    	}
    }
    

    样例代码:

    #include<bits/stdc++.h>
    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;
    }
    

    第一次写题解QwQ求大佬给意见,求支持QwQ

    信息

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