题目和一般的八连通一样,但行数和列数未定,相乘对于1e6,直接开a[1e6][1e6]的数组肯定会爆内存。用二维的动态vector就能很好的解决这个问题
#include<bits/stdc++.h> using namespace std; int dx[10]={-1,0,1,-1,1,-1,0,1}; int dy[10]={1,1,1,0,0,-1,-1,-1}; int n,m; void dfs(vector< vector < bool > >&a,int x,int y) { a[x][y]=0; int X,Y; for(int i=0;i<8;i++) { X=x+dx[i]; Y=y+dy[i]; if(X>=0&&X<n&&Y>=0&&Y<m&&a[X][Y]==1) { dfs(a,X,Y); } } //return ; } int main() { int x,cnt=0; cin>>n>>m; //vector<vector<int> > a(n, vector<int>(m,0)); vector< vector<bool> >a(n); for(int i=0;i<n;i++) { a[i].resize(m); } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cin>>x; a[i][j]=x; } } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(a[i][j]==1) { dfs(a,i,j); cnt++; } } } cout<<cnt<<endl; }
原文地址:https://www.cnblogs.com/hh13579/p/10925375.html
时间: 2024-11-09 20:53:57