问题引入
在打算法竞赛数据样本数据总是较大,如果只是在主函数中定义二维数组很容易出现中需要存储的大小超过内存大小的问题,那我们该如何解决这个问题呢?
问题举例
我们以全球变暖(蓝桥杯2018年省赛B组试题)为例进行解决。
我们只解决这道题的输入存储问题,因为只放上输入描述,具体题可在下面的链接进入进行解决
你有一张某海域NxN 像素的照片,"."表示海洋、"#"表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。
输入描述
第一行包含一个整数 N (1≤N≤1000)。
以下 N 行 N列代表一张海域照片。
照片保证第 1 行、第 1 列、第 N 行、第N 列的像素都是海洋。
解决方法
我首先是在主函数中定义了一个二维数组pic[1010][1010],结果运行的时候发生了内存溢出的问题,在网上查了一下,有如下的解决办法
解法1
将这个二维数组放在主函数外,使其成为一个全局数组,这样最大就可存放arr[10720][100000]大小的数组
解法2
如果数据更大,我们可以用到map容器
map容器的头文件#include <map>
详细使用参照这个博客http://t.csdnimg.cn/R72xa
map的存放
一个map容器含有一个键值和一个value值,这道题可以用map<int,char>pic这样的容器,把arr[100][100]=c替换为pic[100100] = c,键值只要在整型数据大小内就可以完成存储,但是比赛中可能需要定义更大的数组,则需要把 100100转化为“100100”即字符串,然后然后用map<string, char>pic图片
map的遍历
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, char> mp;
map<string,char>::iterator it;
//定义了一个名为it 的迭代器
mp["1010"] = '#';
mp["1111"] = '.';
mp["1212"] = '#';
cout << "遍历如下:"<< endl;
for ( it = mp.begin(); it != mp.end(); it++) {
cout << it -> first << " " << it -> second << endl;
}
return 0;
}
得到的结果