zoukankan      html  css  js  c++  java
  • [Algorithms(Princeton)] Week1

      1 public class Percolation {
      2     private boolean[] openSites;
      3     private int gridN;
      4     private WeightedQuickUnionUF UF;
      5     private WeightedQuickUnionUF UFfull;
      6 
      7     public Percolation(int N) {
      8         if (N <= 0) {
      9             throw new java.lang.IllegalArgumentException(
     10             "N must be greater than 0");
     11         }
     12         openSites = new boolean[N * N];
     13         gridN = N;
     14         for (int i = 0; i < N * N; ++i) {
     15             openSites[i] = false;
     16         }
     17         // add 2 virtual sites
     18         UF = new WeightedQuickUnionUF(N * N + 2);
     19         UFfull = new WeightedQuickUnionUF(N * N + 1);
     20     }
     21 
     22     private void indexChecker(int i, int j) {
     23         if (i < 1 || j < 1 || i > gridN || j > gridN)
     24             throw new java.lang.IndexOutOfBoundsException();
     25     }
     26 
     27     public void open(int i, int j) {
     28         indexChecker(i, j);
     29 
     30         int indexI = i - 1;
     31         int indexJ = j - 1;
     32 
     33         int osIndex = indexI * gridN + indexJ;
     34         if (openSites[osIndex])
     35             return;
     36         openSites[osIndex] = true;
     37 
     38         int ufIndex = indexI * gridN + indexJ + 1;
     39         if (indexI == 0) {
     40             UF.union(0, ufIndex);
     41             UFfull.union(0, ufIndex);
     42         }
     43         if (indexI == gridN - 1) {
     44             UF.union(ufIndex, gridN * gridN + 1);
     45         }
     46 
     47         boolean bOpen = false;
     48 
     49         // union adjacent open sites
     50         int leftIndexI = indexI;
     51         int leftIndexJ = indexJ - 1;
     52         if (leftIndexJ >= 0) {
     53             bOpen = isOpen(leftIndexI + 1, leftIndexJ + 1);
     54             if (bOpen) {
     55                 int leftUFIndex = leftIndexI * gridN + leftIndexJ + 1;
     56                 UF.union(leftUFIndex, ufIndex);
     57                 UFfull.union(leftUFIndex, ufIndex);
     58             }
     59         }
     60 
     61         int rightIndexI = indexI;
     62         int rightIndexJ = indexJ + 1;
     63         if (rightIndexJ < gridN) {
     64             bOpen = isOpen(rightIndexI + 1, rightIndexJ + 1);
     65             if (bOpen) {
     66                 int rightUFIndex = rightIndexI * gridN + rightIndexJ + 1;
     67                 UF.union(ufIndex, rightUFIndex);
     68                 UFfull.union(ufIndex, rightUFIndex);
     69             }
     70         }
     71 
     72         int upIndexI = indexI - 1;
     73         int upIndexJ = indexJ;
     74         if (upIndexI >= 0) {
     75             bOpen = isOpen(upIndexI + 1, upIndexJ + 1);
     76             if (bOpen) {
     77                 int upUFIndex = upIndexI * gridN + upIndexJ + 1;
     78                 UF.union(upUFIndex, ufIndex);
     79                 UFfull.union(upUFIndex, ufIndex);
     80             }
     81         }
     82 
     83         int downIndexI = indexI + 1;
     84         int downIndexJ = indexJ;
     85         if (downIndexI < gridN) {
     86             bOpen = isOpen(downIndexI + 1, downIndexJ + 1);
     87             if (bOpen) {
     88                 int downUFIndex = downIndexI * gridN + downIndexJ + 1;
     89                 UF.union(ufIndex, downUFIndex);
     90                 UFfull.union(ufIndex, downUFIndex);
     91             }
     92         }
     93     }
     94 
     95     public boolean isOpen(int i, int j) {
     96         indexChecker(i, j);
     97         return (openSites[(i - 1) * gridN + j - 1]);
     98     }
     99 
    100     public boolean isFull(int i, int j) {
    101         indexChecker(i, j);
    102         int indexI = i - 1;
    103         int indexJ = j - 1;
    104 
    105         int osIndex = indexI * gridN + indexJ;
    106         int ufIndex = osIndex + 1;
    107 
    108         boolean bOpen = isOpen(i, j);
    109         boolean isFull = UFfull.connected(0, ufIndex);
    110         return (bOpen && isFull);
    111     }
    112 
    113     public boolean percolates() {
    114         if (gridN == 1)
    115             return (openSites[0]);
    116         return UF.connected(0, gridN * gridN + 1);
    117     }
    118 }

    You can see Percolation problem here.

    http://coursera.cs.princeton.edu/algs4/assignments/percolation.html

    This problem is something related to Union-Find.

  • 相关阅读:
    four day (linux基础学习1)
    three day(网络基础)
    two day(操作系统)
    Oldboy One day(计算机基础)
    mybatis调用存储过程
    调用jiathis分享接口
    汉字转换拼音工具类
    Ajax前后台交互 返回普通格式和JSON格式
    Bootstrap与EasyUI入门
    MD5,sha1加密工具类
  • 原文地址:https://www.cnblogs.com/Phoebe815/p/3791403.html
Copyright © 2011-2022 走看看