|
楼主 |
发表于 2010-1-30 19:58:46
|
显示全部楼层
Part 3
知道了这题目本质上可以化为对整数对(x,y)的遍历后,我们是不是可以用P1的方案对x和y进行遍历了啊。
然后这里存在第三个问题:
如何遍历?
你也许会反问说:“这问题不是问过了么?就按照P1的方案不就好了?”
但是在这里,新的关键点在于x和y是互不相关的两个独立变量。如果你使用传统的遍历方式:固定一个值,遍历另一个值->然后固定那个值变动一次,遍历另一个值……即从左到右从上到下依次遍历
(0,0),(0,1),(0,-1),(0,2),(0,-2)……
(1,0),(1,1),(1,-1),(1,2),(1,-2)……
……
这样的方式
依然是行不通的。因为y有无限多种可能。 你遍历完第一行需要无限次,x=1的那行你永远也取不到。
因此这里套用P1的思路是对的,但是不能纯粹照搬,要取P1的方案的本质。P1的方案本质是啥?——以一个特定位置为中心,对称地取值。
可行方案有很多,这里举两个例子:
比如将(x,y)想象成一个直角坐标系,不过可取的点只有那些整数对的点。那么我们就可以随便取一个点作为基点(方便起见,我们取0,0)。然后之后的每次都慢慢以其为中心,以画同心圆或者同心方的方式取值即可,以下就是一种可行的取值顺序
(0,0)
(-1,-1)
(-1,0)
(-1,1)
(1,-1)
(1,0)
(1,1)
(-2,-2)
(-2,-1)
(-2,0)
(-2,1)
(-2,-2)
(2,-2)
(2,-1)
(2,0)
(2,1)
(2,2)
……
这样,我们就得以将遍历次数t()变成直接由x和y决定的函数了。而x,y这两个值必定是有穷整数,那么这个算法里的遍历次数t就必然也是个有穷整数。
于是再一次的,我们把有无限多种取值可能的整数对(x,y)问题变成了遍历次数为一个有限的整数的问题。
算法怎么写?我们可以采用loop until的方式
这里我们把(x,y)作为我们假设的值,而未知函数GetN(int t)为t时刻潜艇的位置,i为t时该扔的位置,并假设,GetN(int t)返回类型为Hdl,无法直接获得它的值,只能进行比较操作。
t=0
loop
t=t+1
取下一个(x,y)对
i=y*t+x
until (GetN(t)==I2H(i))
于是该题解决。
进一步的思考:
其实按照P1到P3的思路,大家很快就会发现,其实有几个变量根本无所谓,如果这个题目是三个未知数组成的整数对,我们还是可以用有限次遍历来得到给定值——无非把同心方方案改成了同心正方体而已。
那么3个、4个、5个、乃至N个,结果都是一样的。
发这个题目一是为了娱乐,也是为了开拓大家思路,简单地来说,就是要求你想出在N维无限集里靠有限次遍历来获得给定元素的方案。 |
|