1 条题解

  • 0
    @ 2025-4-12 21:43:14

    C :

    #include<stdio.h>
    
    int m,n;
    short tab[101][101];
    const int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
    void check(int a,int b){
    	tab[a][b] = 0;
    	int i,x,y;
    	for(i = 0;i < 4;i++){
    		x = a + dir[i][0];
    		y = b + dir[i][1];
    		if(x >=0 && x < m && y >= 0 && y < n && tab[x][y]){
    			check(x,y);
    		}
    	}
    }
    
    int main(){
    	//freopen("a.txt","r",stdin);
    	int T,count,i,j;
    	scanf("%d",&T);
    	while(T--){
    		count = 0;
    		scanf("%d%d",&m,&n);
    		for(i = 0;i < m;i++)
    			for(j = 0;j < n;j++){
    				scanf("%hd",&tab[i][j]);
    			}
    		for(i = 0;i < m;i++)
    			for(j = 0;j < n;j++)
    				if(tab[i][j]){
    					check(i,j);
    					count++;
    				}
    		printf("%d\n",count);
    
    	}
    	return 0;
    }
    

    C++ :

    /**
    dfs深度搜索
    **/
    #include<iostream>
    #include<cstring>
    using namespace std;
    int a[101][101],vis[101][101];
    void dfs(int x,int y){
    if(!a[x][y]||vis[x][y]) return;//已访问或不是水池(a[x][y]==0)
    vis[x][y]=1;//已访问过
    /**搜素上下左右四个方向**/
    dfs(x-1,y);//搜素上面
    dfs(x+1,y);//搜素下面
    dfs(x,y-1);//搜素左面
    dfs(x,y+1);//搜素右面
    }
    int main()
    {
    int m,n,t;
    cin>>t;
    while(t--){
    cin>>m>>n;
    memset(a,0,sizeof(a));
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=m;i++)
    for(int j=1;j<=n;j++)
    cin>>a[i][j];
    int count=0;
    for(int i=1;i<=m;i++){
    for(int j=1;j<=n;j++){
    if(!vis[i][j]&&a[i][j]){//if(有水池)&没有被访问
    count++;
    dfs(i,j);
    }
    }
    }
    cout<<count<<endl;
    }
    return 0;
    }
    
    
    
    • 1

    信息

    ID
    1326
    时间
    3000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者