PageRenderTime 27ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/Algorithms/Percolates/Percolation.java

https://bitbucket.org/celebornbg/java-algorithms
Java | 135 lines | 106 code | 26 blank | 3 comment | 19 complexity | b206b844bfcf775a510ddd5c4ed835b4 MD5 | raw file
  1. public class Percolation {
  2. private int rows;
  3. private int columns;
  4. private int dimen;
  5. private boolean[] siteOpen;
  6. private int adjacentSeed;
  7. private int seed;
  8. private int N;
  9. private WeightedQuickUnionUF wQU;
  10. public Percolation(int N) // create N-by-N grid, with all sites blocked
  11. {
  12. this.N = N;
  13. setRows(N);
  14. setColumns(N);
  15. setDimen(getRows() * getColumns());
  16. siteOpen = new boolean[dimen];
  17. setAdjacentSeed(0);
  18. setSeed(0);
  19. wQU = new WeightedQuickUnionUF(dimen+2);
  20. }
  21. private int getRows() {
  22. return rows;
  23. }
  24. private int getColumns() {
  25. return columns;
  26. }
  27. private int getDimen() {
  28. return dimen;
  29. }
  30. private int getAdjacentSeed() {
  31. return adjacentSeed;
  32. }
  33. private int getSeed() {
  34. return seed;
  35. }
  36. private void setRows(int i) {
  37. rows = i;
  38. }
  39. private void setColumns(int i) {
  40. columns = i;
  41. }
  42. private void setDimen(int i) {
  43. dimen = i;
  44. }
  45. private void setAdjacentSeed(int i) {
  46. adjacentSeed = i;
  47. }
  48. private void setSeed(int i) {
  49. seed = i;
  50. }
  51. private void validationIndeces(int i, int j) {
  52. if (i <= 0 || i > N) throw
  53. new IndexOutOfBoundsException("row index i out of bounds");
  54. if (j <= 0 || j > N) throw
  55. new IndexOutOfBoundsException("column index i out of bounds");
  56. }
  57. public void open(int i, int j) { // open site (row i, column j) if not already
  58. validationIndeces(i, j);
  59. setSeed((getRows() * (i-1)) + (j-1));
  60. siteOpen[getSeed()] = true;
  61. if ((i > 1) && isOpen(i-1, j))
  62. {
  63. setAdjacentSeed((getRows() * (i-2)) + (j-1));
  64. wQU.union(getSeed(), getAdjacentSeed());
  65. }
  66. //Lower Cell
  67. if ((i < getRows()) && isOpen(i+1, j))
  68. {
  69. setAdjacentSeed(((getRows() * i) + (j-1)));
  70. wQU.union(getSeed(), getAdjacentSeed());
  71. }
  72. //Left Cell
  73. if ((j > 1) && isOpen(i, j-1))
  74. {
  75. setAdjacentSeed(((getRows() * (i - 1)) + (j - 2)));
  76. wQU.union(getSeed(), getAdjacentSeed());
  77. }
  78. //Right Cell
  79. if ((j < getColumns()) && isOpen(i, j+1))
  80. {
  81. setAdjacentSeed(((getRows() * (i - 1)) + (j)));
  82. wQU.union(getSeed(), getAdjacentSeed());
  83. }
  84. if (i == 1) {
  85. wQU.union(getDimen(), getSeed());
  86. }
  87. if (i == getRows()) {
  88. wQU.union(getDimen()+1, getSeed());
  89. }
  90. }
  91. public boolean isOpen(int i, int j) { // is site (row i, column j) open?
  92. validationIndeces(i, j);
  93. return siteOpen[((getRows() * (i-1)) + (j-1))];
  94. }
  95. public boolean isFull(int i, int j) { // is site (row i, column j) full?
  96. validationIndeces(i, j);
  97. if (isOpen(i, j)) {
  98. setSeed((getRows() * (i-1)) + (j-1));
  99. if (wQU.connected(getDimen(), getSeed()))
  100. return true;
  101. }
  102. return false;
  103. }
  104. public boolean percolates() { // does the system percolate?
  105. if (wQU.connected(getDimen(), getDimen()+1))
  106. return true;
  107. return false;
  108. }
  109. }