题意
原题目:http://coursera.cs.princeton.edu/algs4/assignments/percolation.html
percolate
渗透,扩散
给定一个正方形的图,图上每个点(site)的状态初始为非open,即下图中的黑色部分,现在随机逐个打开其中的某些site,使之转变为open状态,判断上下是否联通,即相当于从图上方灌水,问是否能渗透到最底下。
现在把能够渗透的状态称为percolate
若要表示图percolate的概率
和单个点open的概率
的关系,可以用以下的曲线图表示:
左边的是20x20的图,右边是100x100的矩阵。
要完成的任务Percolation.java
如下:
|
|
具体要求参见原题。
解决方案
如何将二维图投射到一维
so easy!
|
|
什么是isFull状态
即从上到下渗透的过程中,被“填充”的open位置的状态。
如何open
对于public void open(int row, int col)
方法,有如下的解决方案:
1. 将Index(row, col)位置的site打开
2. 判断上下左右是否打开,若打开,union之。
但是这个方案有个很大的缺点,即所谓的backwash问题:在percolate之前,有些块位于图的最下方,与底部相连通,一旦percolate,这些点也会被认为是isFull状态的,这与事实不符。
故提出如下改进的解决方案:
1. 设置每个点的状态有ConnectToTop和ConnectToBottom,即是否与上和下联通。
2. open时,将Index(i, j)位置的site打开,union操作同之前的方案。
3. 若相邻的Index(i+dx[k],j+dy[k])的root或者目前位置的root与top联通,则该位置的root为ConnectToTop,bottom同理。
4. 若ConnectToTop并且ConnectToBottom,则percolate。
代码
下面给出Percolation.java
的代码
|
|