我刚开始学习python,虽然最好的方法是解决一些简单的算法问题。我遇到了这个问题:
从旧书中找回了一个奇怪的网格。它有5列和无限行数。底行被视为第一行。网格的前几行是这样的:
..............
..............
20 22 24 26 28
11 13 15 17 19
10 12 14 16 18
1 3 5 7 9
0 2 4 6 8
网格永远向上发展! 行从下到上编制索引,列从左到右编制索引。 任务是在网格的 rth 行的 cth 列中找到整数。
实施例: 输入:6 3
输出:25
第6行和第3列的数字是25。
此问题的解决方案是:
import sys
for line in sys.stdin:
r = int(line.split(' ')[0])
c = int(line.split(' ')[1])
if r%2 == 1:
print ((r-1)/2)*10 + (c-1)*2
else:
print ((r-1)/2)*10 + (c-1)*2 + 1
我明白我们为什么要采用r%2 == 1
以及我们为什么要使用((c-1)*2)+1)+(((r-1)/2)
答案 0 :(得分:2)
只看奇数行。在第一列中,值为0,10,20。在第二列中,值为2,12,22。在第3列中,为4,14,24。
现在看一下偶数行。在第一列中,值为1,11,21。第二列:3,13,23。第三列:5,15,25。
你是否看到当你向上移动行时,值增加了10?不是每一行,而是每隔一行?这就是为什么我们((r-1)/2)*10
- 首先我们将r
向下舍入到最接近的2的倍数,然后我们乘以10.这给出了十位的值。
再看一下奇数行。在第一行中,值为0,2,4,6,8。在第三行:10,12,14,16,18。第五行:20,22,24,26,28。
现在回到偶数行。在第二行,我们有1,3,5,7,9。第四行:11,13,15,17,19。
你是否看到行中的数字值如何增加2?在奇数行的情况下,它们是偶数。在偶数行中,它们是偶然的。这就是为什么我们if r%2 == 1
:检查我们是否正在处理奇数或偶数行以处理这种分支行为。
如果r
为奇数,我们会计算c-1
2的倍数 - 这是(c-1)*2
。另一方面,如果r
是偶数,我们计算2的c-1
倍数加1(从而使值奇数)。 (c-1)*2 + 1
。
由于通过知道行号生成的值描述了十位数,并且通过知道列号生成的值描述了那个数字,我们可以将这两个值一起添加。在((r-1)/2)*10 + (c-1)*2
为奇数的情况下为r
,在((r-1)/2)*10 + (c-1)*2 + 1
为偶数的情况下为r
。
感谢John的编辑建议!