原题目链接
原题目:洛谷 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) #输出
博客围绕洛谷P1328题目展开,介绍了解题思路,包括读入数据、用变量指向手势、判断输赢计分、移动指向及输出比分。还提到原链接只给表格,为方便判断将表格补全。最后给出代码实现,并声明抄袭代码是恶劣行为。
2060

被折叠的 条评论
为什么被折叠?



