寻宝 大冒险
题目传送:http://118.190.20.162/view.page?gpid=T147
思路及代码:
核心点就是哈希。
之前刷的是70分,找不到之前的代码了,大概是建了一个很大的表,然后一点点比较吧。
今天再刷,上来就是哈希。
把每棵树的坐标(x,y)作为藏宝图的(0,0)位置,然后判断这棵树的位置满不满足条件。怎么判断呢?
先把藏宝图reverse一下,然后藏宝图中的每个坐标都加分别加上x,y。如果是1则判断绿化图中树的坐标中有没有它,没有就说明这个点不对,跳出循环。如果是0,但树中有它说明也对不上,跳出循环。另外一点就是,如果越界的话也不行,跳出循环。
那怎么查找?哈希表的查找时间复杂度是O(1)啊!
python里集合也是哈希表!(集合不能通过索引访问)
代码:
n, L, S = map(int, input().split())
trees = set()
for i in range(n):
x, y = map(int, input().split())
trees.add((x, y))
graph = []
for i in range(S+1):
graph.append(list(map(int, input().split())))
# 以每棵树为起始点(0,0)判断 这个位置是否是满足条件的点
graph.reverse()
ans = 0
for k in trees:
x, y = k[0], k[1]
flag = 1
for j in range(S+1):
for k in range(S+1):
cur_x, cur_y = x + j, y + k
if cur_x > L or cur_y > L:
flag = 0
break
if graph[j][k] == 1 and (cur_x, cur_y) not in trees:
flag = 0
break
elif graph[j][k] == 0 and (cur_x, cur_y) in trees:
flag = 0
break
if flag:
ans += 1
print(ans)
知识点巩固:
1.python中集合set和字典dict都是哈希表。只不过set只有key,dict是key-value键值对。(我之前一直认为只有key:value才是哈希表)
2.集合和字典都无法通过索引进行访问,但可以通过**for k in 集合/字典:**的形式遍历里面的元素。
3.python中列表、字典、元组、字符串和集合都是可迭代对象,可迭代对象就是可以通过for … in…的方式进行遍历。可以用collections.abc(3.8版本,之前的版本就是collections)里的Iterable来判断该对象是不是可迭代对象。
4.与之关联的,可迭代对象与迭代器的关系,什么是迭代器什么又是生成器呢?
可迭代对象是可直接作用于for循环的数据类型,一类是集合数据类型,如列表、元组、字符串、字典、集合等,一类是生成器。
迭代器(iterator)只能从前往后访问元素,有两个基本的方法是iter()和next()。前者是创建迭代器对象,后者是输出迭代器的下一个元素。其中,列表、元组、字符串、字典、集合都可以创建迭代器。需要注意的是,他们虽然是可迭代对象(iterable)但不是迭代器(iterator),可以通过iter()函数获得一个Iterator对象。
在python中使用yield函数被称为生成器。生成器是一个返回迭代器的函数,只能用于迭代操作,即生成器是迭代器的一种。在调用生成器的过程中,每次遇到yield时函数就会暂停并保存当前所有的运行信息,返回yield值,在下一次执行next()的时候从当前位置继续执行。因此,生成器的出现使得python模仿协同程序的概念能够实现。协同程序的概念就是函数可以暂停或者挂起,并且在需要的时候从程序离开的地方继续或重新开始。
5.python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象;可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化.
不可变:Number(数字(int float bool))、String(字符串)、Tuple(元组)。
可以变:Set(集合)、List(列表)、Dictionary(字典)。
6.无论是集合还是字典,列表都没法做key值,列表是不可哈希对象。疑问:什么是可哈希什么是不可哈希?可哈希要求这个对象在生存期内必须不可变。以列表举例,列表是可变的,里面的值变了之后地址没变,就相当与不同的key值映射到相同的value,显示是不符合哈希特性的。所以,可哈希的也就是不可变的数据类型,包括数字、字符串和元组。而可变数据类型集合、列表和字典都不是可哈希对象(没法作为key)。
7.集合里的元素怎么变啊?增加一个元素用add,增加多个元素用update,删除一定存在的元素用remove(否则会报错),删除不一定存在的元素用discard。