8 条题解

  • 3
    @ 2026-5-18 19:24:31

    刚学了博主的并查集,用并查集做了一下

    //#include <iostream>
    //#include <queue>
    //using namespace std;
    //typedef pair<int,int> PII;
    //int dx[]={1,0,-1,0};
    //int dy[]={0,-1,0,1};
    //const int N=510;
    //int board[N][N];
    //bool stu[N][N];
    //int n;
    //bool bfs(int x,int y){
    //	if(!board[x][y]) return false;
    //	if(stu[x][y]) return false;
    // 	queue<PII> q;
    // 	q.push({x,y});
    // 	stu[x][y]=true;
    //	while(!q.empty() ){
    //		PII temp=q.front() ;
    //		q.pop() ;
    //		for(int i=0; i<4; i++){
    //			int a=temp.first +dx[i],
    //				b=temp.second +dy[i];
    //			if(a<1 || a>n || b<1 || b>n) continue;
    //			if(!board[a][b]) continue;
    //			if(stu[a][b]) continue;
    //			stu[a][b]=true;
    //			q.push({a,b}); 
    //		}
    //		
    //		
    //		
    //		
    //	} 
    // 	
    //	return true;
    //	
    //	
    //	
    //	
    //	
    //	
    //	
    //	
    //}
    //
    //
    //
    //int main()
    //{
    //	
    //	ios::sync_with_stdio(false);
    //	cin.tie(0);
    //	cin>>n;
    //	for(int i=1; i<=n; i++){
    //		for(int j=1; j<=n; j++){
    //			cin>>board[i][j];
    //		} 
    //	}
    //	
    //	int ans=0;
    //	
    //	for(int i=1; i<=n; i++){
    //		for(int j=1; j<=n; j++){
    //			if(bfs(i,j)) ans++;
    //		}
    //	}
    //	cout<<ans<<endl;
    //	
    //	
    //	return 0;
    //}
    
    
    
    
    
    
    
    
    //并查集
    #include <iostream>
    using namespace std;
    const int N=510;
    int dx[]={1,0,-1,0};
    int dy[]={0,1,0,-1};
    int board[N][N];
    int n;
    int f[N*N];
    int find(int x){
    	if(f[x]==x) return x;
    	else return f[x]=find(f[x]);
    }
    
    void merge(int x,int y){
    	x=find(x);
    	y=find(y);
    	if(x!=y){
    		f[y]=x;
    	}
    }
    
    bool same(int x,int y){
    	return find(x)==find(y);
    }
    //坐标转换 
    int change(int x,int y){
    	return (x-1)*n+y;
    }
    
    
    int main(){
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	
    	cin>>n;
    	for(int i=1; i<=n; i++){
    		for(int j=1; j<=n; j++) {
    			cin>>board[i][j];
    			f[change(i,j)]=change(i,j);
    		}
    	}
    	
    	for(int i=1; i<=n; i++){
    		for(int j=1; j<=n; j++){
    			if(!board[i][j]) continue;
    			for(int k=0; k<4; k++){
    				int a=i+dx[k],
    					b=j+dy[k];
    				if(!board[a][b]) continue;
    				merge(change(i,j),change(a,b));
    			}
    		}
    	}
    	
    	int ans=0;
    	for(int i=1; i<=n; i++){
    		for(int j=1; j<=n; j++){
    			if(!board[i][j]) continue;
    			if(find(change(i,j)) == change(i,j)) ans++;
    		}
    	}
    	
    	
    	cout<<ans <<endl;
    	
    	
    	return 0;
    } 
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    信息

    ID
    33
    时间
    1000ms
    内存
    256MiB
    难度
    普及−
    标签
    递交数
    443
    已通过
    185
    上传者