无法解密Python算法

时间:2015-04-13 21:34:17

标签: python algorithm python-2.7

我刚开始学习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)

1 个答案:

答案 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的编辑建议!