八连通(vector动态数组法)

题目和一般的八连通一样,但行数和列数未定,相乘对于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;
}

猜你喜欢

转载自www.cnblogs.com/hh13579/p/10925375.html