编程玑珠

标题之所以叫做“编程玑珠”而不是“编程珠玑”,是我怕搜索这本书的网友产生误会,但我要表达的意思是一致的。

今天做一个算法,有一处需要根据输入,对(x, y)在给定方向上进行一个位移,从正西顺时针到西南,共有8个方向。我当然不会傻到判断8个方向,而是把平面分别按x轴和y轴切成两半进行处理:

//竖直方向位移
if(dir > Left && dir < Right)
{
    newPos.row = pos.row - 1;
}
else if(dir == Left || dir == Right)
{
    newPos.row = pos.row;
}
else
{
    newPos.row = pos.row + 1;
}

//水平方向位移
if(dir > Up && dir < Down)
{
    newPos.column = pos.column + 1;
}
else if(dir == Up || dir == Down)
{
    newPos.column = pos.column;
}
else
{
    newPos.column = pos.column - 1;
}

这是整个算法中非常细小的一部分,当时也没有多想,感觉这么做也可以了。不过后来看一朋友做的,发现她采用了表驱动法,即预生成一个一维数组delta,数组的标号即对应了方向的编号,数组的值即x与y分别应增加的值。比如正北方向编号为2,则delta[2] = (0, –1)。那在实际中进行位移时,只需要将当前坐标pos + delta[dir]即可,效率极高。

我又如何不了解表驱动法,然和informed和skilled比较还是有相当的差距。我们整天考虑设计模式、对象设计,却越来越忽略了这些细微之处~

posted on 2010-03-08 20:25  Gildor Wang  阅读(889)  评论(0编辑  收藏  举报

导航