class WalkThrough { }; 万事开头难,但现在我们显然已经开了一个不错的头,嗯,继续。在考虑具体实现之前,先幻想一下我们的WalkThrough能为用户提供怎样的服务——当然,它的本职工作是找到并返回可行状态,因此它似乎应该有一个类似于getFilter()的成员函数。问题是,如果可行状态不止一个时,getFilter()应当返回一个可行状态还是所有的可行状态?不难想象,返回所有可行状态的作法并不太现实,因为:1.有时候用户只需要一个,或者少数几个可行状态,此时把所有的可行状态都穷举出来显然是低效而不必要的;2.甚至,有些问题的可行状态数量是无限的,如穷举素数,此时返回所有状态当然不可能。同时考虑到用户要求的仍有可能是不止一个可行解,我们现在知道,应当提供一个getNextFilter()而不是getFilter()的函数:第一次调用它时,将返回从初始状态开始,依序遍历到的第一个可行状态;而此后的调用都将以上次调用为起点继续向前遍历,返回下一个可行状态。需要注意的是,如果已经遍历完了状态全集,显然再调用此函数是没有意义的,所以它应当返回一个标志,反馈给用户是否遍历已经完成。我们将这个函数定义为bool,如果调用有效,则返回true,反之如果已经完成遍历,则返回false. 显然,我们相应需要一个私有的State对象变量curState,它用于存储当前的状态值。 我们是否应当给getNextFilter加上一个State引用参数,以向用户返回每次穷举到的可行状态?在这里我们并没有这样做。试想,可能用户会想获得第5个遍历到的可行状态,那么他当然就要调用5次getNextFilter(),但前4次他并不要求得到所搜索到的可行状态。所以,我们将“找到下一个可行状态”与“获得当前找到的可行状态”分离开来,新增加一个getState()成员函数,它返回一个State对象,注意到getState()操作并不影响WalkThrough对象的内部状态,所以它同时应被声明为const成员函数。 相应地,我们需要一个setState()成员函数,它用于改变当前的状态值,例如设置初始状态的时候都有可能用到。它带一个const State&类型的参数,用以指定所要设定的State值,由于State可能是一个较大的类型,所以使用引用传递能保证效率,同时加上const限制则保证该函数不会更改所传入的引用对象本身的值。 同时用户可能需要知道,对于一个穷举对象,是否已经完成穷举,当然他可以调用getNextFilter()并检查返回值,但如果遍历没有完成,则getNextFilter()除了最后返回true之外还会额外地进行搜索,并将当前状态改为下一个可行状态,这份额外的工作可能并不是用户所期望需要的。因此我们将增加一个成员函数isOver(),它不带参数,返回一个bool值:如果已经完成遍历,返回true,反之返回false. 相应地,我们需要一个私有bool变量overFlag,它用于存储isOver()所需要的状态值。 至此,WalkThrough的定义如下:
|
正在阅读:经验分享:闲谈C++算法封装之穷举法经验分享:闲谈C++算法封装之穷举法
2004-03-26 10:05
出处:CSDN
责任编辑:linjixiong
键盘也能翻页,试试“← →”键