原题目链接
原题目:洛谷 P1328
解题思路
1.读入数据
2.利用变量指向本局对战,各自出的手势
3.判断输赢,计分
4.移动指向(向后顺移。注意,如果超出范围则回归为0)
5.输出比分
谁输谁赢?
这是个比较头疼的问题。原链接只给了一张表格:
结果 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
0 | 平 | 输 | 赢 | 赢 | 输 |
1 | - | 平 | 输 | 赢 | 输 |
2 | - | - | 平 | 输 | 赢 |
3 | - | - | - | 平 | 赢 |
4 | - | - | - | - | 平 |
这样的话,就需要两次判断计分(A和B各一次)。
所以,为了方便起见,我把表格补全了:
结果 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
0 | 平 | 输 | 赢 | 赢 | 输 |
1 | 赢 | 平 | 输 | 赢 | 输 |
2 | 输 | 赢 | 平 | 输 | 赢 |
3 | 输 | 输 | 赢 | 平 | 赢 |
4 | 赢 | 赢 | 输 | 输 | 平 |
(补全方法:每一斜行,以“平”为分界线,做类似对称的移动,即右上→左下,再将左下部分取相反即可)
如图:
这样,只需要对于当前A的手势(左侧一列)进行每行的判断即可。
代码实现
重要声明:抄袭、复制代码是非常恶劣的行为。此类行为将会导致您成为作弊者。代码仅供参考。
N,NA,NB=map(int,input().split())
A=list()
B=list()
A=list(map(int,input().split()))
B=list(map(int,input().split()))
pa=0 #指向A的手势
pb=0 #指向B的手势
sa=0 #A的分数(score of a)
sb=0 #B的分数(score of b),不要想太多
for i in range(N):
if A[pa]==B[pb]: #平局
pass #各得0分
elif A[pa]==0:
if B[pb]==1:
sb+=1
if B[pb]==2:
sa+=1
if B[pb]==3:
sa+=1
if B[pb]==4:
sb+=1
elif A[pa]==1:
if B[pb]==0:
sa+=1
if B[pb]==2:
sb+=1
if B[pb]==3:
sa+=1
if B[pb]==4:
sb+=1
elif A[pa]==2:
if B[pb]==0:
sb+=1
if B[pb]==1:
sa+=1
if B[pb]==3:
sb+=1
if B[pb]==4:
sa+=1
elif A[pa]==3:
if B[pb]==0:
sb+=1
if B[pb]==1:
sb+=1
if B[pb]==2:
sa+=1
if B[pb]==4:
sa+=1
elif A[pa]==4:
if B[pb]==0:
sa+=1
if B[pb]==1:
sa+=1
if B[pb]==2:
sb+=1
if B[pb]==3:
sb+=1
pa+=1 #顺移指向
pb+=1
if pa>=len(A): #防止指向列表外部
pa=0
if pb>=len(B):
pb=0
print(sa,sb) #输出