编程玑珠
标题之所以叫做“编程玑珠”而不是“编程珠玑”,是我怕搜索这本书的网友产生误会,但我要表达的意思是一致的。
今天做一个算法,有一处需要根据输入,对(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) 编辑 收藏 举报