八连通(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;
}

原文地址:https://www.cnblogs.com/hh13579/p/10925375.html

时间: 2024-11-09 20:53:57

八连通(vector动态数组法)的相关文章

C++ Vector 动态数组

Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度. Constructors 构造函数 Operators 对vector进行赋值或比较 assign() 对Vector中的元素赋值 at() 返回指定位置的元素 back() 返回最末一个元素 begin() 返回第一个元素的迭代器 capacity() 返回vector所能容纳的元

cpp中vector动态数组(一种container)的简单用法

vector<int> num; for (int i=0; i<10; ++i)num.push_back(i); num.push_back(10); num.push_back(10); cout << "Original array:\n"; //vector<int>::iterator it; //C++11之前用的,11之后可以用auto for (auto it=num.begin(); it!=num.end(); ++it)

vector动态二维数组(容器的容器)占用内存分析

之前在这里写过一篇"C++中的动态二维数组".在C++中没有动态二维(多维)数组.但是根据原理我们可以自己创建. 在看过STL的vector源代码后"<STL源码剖析>---stl_vector.h阅读笔记"后,想到可以用容器的容器来做二维数组. 创建一个2x4的二维数组.想到的办法是:先创建一个容器的容器,外层大小的2(2行),然后里面容器小大为4(4列). int row=2,col=4; vector<vector<int> &g

c++动态数组vector

(这篇随笔主要和大家分享一下在信竞中c++中动态数组vector的用法,那些跟竞赛没毛关系的就不说了..) 相信大家都知道c++里有一个nb的STL模板库..(在这里膜一下STL) 今天我们就要扯一扯这里面的一个容器:动态数组vector. vector实际上类似于a[]这个东西,也就是说它重载了[]运算符.(真是66666666) 使用vector时需要加上<vector>这个头文件. 定义方法:vector <类型名> 变量名; 例: vector <int> a;

动态数组vector

动态数组 动态数组可以实现长度的自由变化,但是通过vector的默认值可以基本判断所谓动态数组实际上还是一个普通数组,传递一个参数确定数组长度,如果没有传递参数,程序中其实默认进行设定.如果插入数据之后超过了已有长度,则在内部进行了一个创建第三方的过程,将现在的数组保存起来,然后再次创建一个新的长度的数组,然后根据插入值进行重新整合. 笔者并未看过源码,只是按照功能试着进行实现. 1.array.h 1 #pragma once 2 3 #include <iostream> 4 using

转:用STL中的vector动态开辟二维数组

用STL中的vector动态开辟二维数组 源代码:#include <iostream>#include <vector>using namespace std;int main(){ int m, //行数     n; //列数 cout << "input value for m,n:"; cin>>m>>n;  //注意下面这一行:vector<int后两个">"之间要有空格!否则会被认

动态数组 - vector

1 #include <iostream> 2 #include <vector> // 头文件 3 using namespace std; 4 5 int main() 6 { 7 vector<int> v; // 定义一个动态数组 vector<T> v; 8 9 // 几种初始化方式: 10 vector<int> v1(7); // v1中会含有7个元素size() == 7, 都赋值为0 11 vector<int> v

Delphi 之 第八课 动态数组

Delphi 4 的动态数组 传统的Pascal 语言其数组大小是预先确定的,当你用数组结构声明数据类型时,你必须指定数组元素的个数.专业程序员也许知道些许动态数组的实现技术,一般是采用指针,用手工分配并释放所需的内存. Delphi 4中增加了非常简单的动态数组实现方法,实现过程效仿我前面讲过的动态长字符串.与长字符串一样,动态数组的内存动态分配并且引用记数,不过动态数组不支持 copy-on-write 技术.这不是个大问题,因为你可以把变量值设置为nil释放数组内存. 这样你就可以声明一个

C基础 万能动态数组

引言 - 动态数组切入 开发中动态类型无外乎list 或者 vector, 这里就是在C中实现vector结构容器部分. 对于C中使用的数据结构, 可以参照下面感觉很不错框架源码学习 , 感觉是<<C接口与实现>>的标准Demo twemproxy  https://github.com/twitter/twemproxy/tree/master/src 写的很清楚易懂, 给人一种铺面而来的美感. 关于动态数组设计的总思路, 主要体现在下面的数组结构 struct array {}