编程玑珠

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

今天做一个算法,有一处需要根据输入,对(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比较还是有相当的差距。我们整天考虑设计模式、对象设计,却越来越忽略了这些细微之处~

转载于:https://www.cnblogs.com/Gildor/archive/2010/03/08/1681043.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值