问题描述: 通过无人机航拍我们己经知晓了n处尚待清理的垃圾位置,其中第i(1≤i≤n) 处的坐标为(x,y),保证所有的坐标均为整数。 我们希望在垃圾集中的地方建立些回收站。具体来说,对于一个位置(x,y)是否适合建立回收站,我们主要考虑以下几点: 1.(x,y)必须是整数坐标,且该处存在垃圾; 2.上下左右四个邻居位置,即(x,y+1)、(x,y-1)、(x+1,y)和(x-1,y)处,必须全部存在垃圾:
3.进一步地,我们会对满足上述两个条件的选址进行评分,分数为不大于4的自然数,表示在(x±1,y±1)四个对角位置中有几处存在垃圾现在,请你统计一下每种得分的选址个数。
输入格式 从标准输入读入数据。 输入总共有n+1行。 第1行包含一个正整数n,表示已查明的垃圾点个数。 第1+i行(l≤i≤n)包含由一个空格分隔的两个整数x和y,表示第i处垃圾的坐标。 保证输入的n个坐标互不相同。
输出格式 输出到标准输出。 输出共五行,每行一个整数,依次表示得分为0、1、2、3和4的回收站选址个数。
样例输入 7 1 2 2 1 0 0 1 1 1 0 2 0 0 1
样例输出 0 0 1 0 0 ?
思路:
1.利用Python的 ‘in’ 运算符可以十分方便的检测目标元组是否存在于列表里的特点,我们只需要构建一个含有所有点(由x,y坐标构成的元组)的列表,输出是按照分数输出所以构建一个含有五种得分的计数列表。
2.题目说垃圾站只能建立在有垃圾的地方,所以直接遍历步骤1里的元组并检测条件是否符合(四周均含有垃圾)。
3.设置一个计数器在步骤二的循环内部,这样可以每次都能初始化。并且能够进入步骤2循环并且符合判断条件(四周都有垃圾)的监测点将通过四个检测(即四个对角是否有垃圾)若检测通过则计数器加1。
4.计数器不仅代表得分,更能作为下标直接索引到计数列表使对应位置增加数量,最后遍历列表输出即可。
po_list=[]
num=[0,0,0,0,0]
n=eval(input())
for i in range(n):
x,y=map(int,input().split())
po=(x,y)
if po not in po_list:
po_list.append(po)
for x,y in po_list:
if (x,y+1) in po_list and (x,y-1) in po_list and (x-1,y) in po_list and(x+1,y)in po_list:
count=0
if (x+1,y+1) in po_list:
count+=1
if (x+1,y-1) in po_list:
count+=1
if (x-1,y+1) in po_list:
count+=1
if(x-1,y-1) in po_list:
count+=1
num[count]+=1
for i in range(len(num)):
print(num[i])
|