Assignment 1 :Percolation

最初版本的实现十分容易,采用课程的提示,在UF中添加 virtual top site 和 virtual bottom site,并采用的是用一个boolean数组op跟踪一个site是否打开,如果未打开,则调用open函数。

但是这样会出现 backwash 问题,即 percolates 后一个site实际并没有连接top却也显示full(原因是这个site通过virtual bottom site 连接 virtual top site),要解决这个问题,思路是full函数中怎样让一个site不去连接 virtual bottom site,最先想到的用 double UF,其中一个UF没有 virtual bottom site,检查full是调用这个UF。这样能通过所有test,但无法拿到 bonus 。

想到用一个n*n的数组status追踪每个site的情况,情况分为(OPEN 0x01, TOP 0x02, BOTTOM 0x04, 这样设定是为了方便位运算)。这样一来,isOpen只要检查第一位是否为1,isFull只要检查root第二位是否为1,percolates只要检查virtual top site的root第二位和第三位是否均为1,。这个方法的难点在open,open一个site时,应该如何设定它的初值?open之后要union它四周已经open的site,这是该如何设定union之后root的状态?

 

posted @ 2015-09-22 01:16  whu.yt  阅读(123)  评论(0编辑  收藏  举报