首先,惯例看下题目要求:
在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里,BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。
你需要处理这个副本其中的一个机制:N×M 大小的地图被拆分为了 N×M 个 1×1 的格子,BOSS 会选择若干行或/及若干列释放技能,玩家不能站在释放技能的方格上,否则就会被击中而失败。
给定 BOSS 所有释放技能的行或列信息,请你计算出最后有多少个格子是安全的。
输入格式:
输入第一行是三个整数 N,M,Q (1≤N×M≤105,0≤Q≤1000),表示地图为 N 行 M 列大小以及选择的行/列数量。
接下来 Q 行,每行两个数 Ti,Ci,其中 Ti=0 表示 BOSS 选择的是一整行,Ti=1 表示选择的是一整列,Ci 为选择的行号/列号。行和列的编号均从 1 开始。
输出格式:
输出一个数,表示安全格子的数量。
输入样例:
5 5 3
0 2
0 4
1 3
输出样例:
12
然后,经过简单的数学分析,比如一行一列相交一点,一行两列相交两点,两行三列相交6点,所以要算安全格子时要注意多减去的部分
安全格子数=总的格子数-行数×列宽-列数×行宽+多减去的部分
由于0时为行,1时为列,所以很容易得到下面的代码:
a,b,c=map(int,input().split())
d,e,f=0,0,[]
a1,a2=0,0
for i in range(c):
f.extend(list(map(int,input().split())))
for i in range(len(f)):
if f[i]==0:
d+=1
elif f[i]==1 and i%2==0:
e+=1
g=a*b-d*b-e*a+d*e
print(g)
看上去是不是很好,一检测,发现,有几个测试点始终过不了
回去仔细审题,题目并没有说boos不能连续攻击同一行/列,也即
当这样输入时:
2 3 4
0 1
1 1
1 1
0 1
结果返回0而不是2(画下图就能明白)
那么,问题来了,如何去掉重复的部分呢,我个人是尝试了各种办法,均以失败告终。但功夫不负有心人,我还是寻得了解决办法。从第二次循环开始,每次记录0/1后面的那个数,当下次再遇到时,d/e减1,这样相当于去掉了重复的影响。注意:这里不能用单个变量来记录,不然每次记录的值会变化,我这里用的是列表。最终效果如下:
a,b,c=map(int,input().split())
d,e,f,h1,h2=0,0,[],[],[]
a1,a2=0,0
for i in range(c):
f.extend(list(map(int,input().split())))
for i in range(len(f)):
if f[i]==0:
d+=1
if i>=1 and f[i+1] in h1:
a1+=1
h1.append(f[i + 1])
elif f[i]==1 and i%2==0:
e+=1
if f[i+1] in h2:
a2+=1
h2.append(f[i + 1])
d=d-a1
e=e-a2
g=a*b-d*b-e*a+d*e
print(g)
新人报到,请多指教!