
①如用memset初始化,需要添加
②各个变量的范围需要确定好。
③题中L最大是10^9,无法开那么大的二维数组,故以下代码只能得70分。
#includeusing namespace std; #define MAX 2005 struct map { int x, y; }map[MAX]; int mapGlobal[MAX][MAX] = { 0 }; int mapLocal[MAX][MAX] = { 0 }; int main() { int n, L, S, x, y, flag, num = 0; scanf("%d %d %d", &n, &L, &S); for (int i = 0; i < n; ++i) { scanf("%d %d", &x, &y); mapGlobal[x][y] = 1; map[i].x = x, map[i].y = y; } for (int i = S; i >= 0; --i) for (int j = 0; j <= S; ++j) { scanf("%d", &x); mapLocal[i][j] = x; } for (int i = 0; i < n; ++i) { x = map[i].x, y = map[i].y, flag = 0; if (x <= L - S && y <= L - S) { for (int j = 0; j <= S; ++j) { for (int k = 0; k <= S; ++k) if (mapLocal[j][k] != mapGlobal[j + x][k + y]) { flag = 1; break; } if (flag == 1)break; } if (flag == 0)num++; } } printf("%d", num); return 0; }
这道题的关键就在于如何进行大数据的存储。
查找资料后,发现可以使用STL中的map容器。
map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,从而提高了查找的效率。
其相关用法如下:
①加头文件
#include
②定义一个二维的map
map>mapGlobal;
对于map映射,是第一个数据(key)映射到第二个数据(value)上,即形成了key-value的映射关系。其中,每个关键字只能出现一次,以作索引。
这个map中的key是int型,value是map类型。
③赋值(类似二维数组)
mapGlobal[x][y] = 1;
因此,进行几处小改动后就可以通过,AC代码如下:
#include#include