Advertisement
Guest User

Untitled

a guest
Nov 17th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.74 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. enum Position {RIGHT, LEFT}
  5.  
  6. public class State {
  7.  
  8. private int cannibalLeft;
  9. private int missionaryLeft;
  10. private int cannibalRight;
  11. private int missionaryRight;
  12. private Position boat;
  13.  
  14. private State parentState;
  15.  
  16. public State(int cannibalLeft, int missionaryLeft, Position boat,
  17. int cannibalRight, int missionaryRight) {
  18. this.cannibalLeft = cannibalLeft;
  19. this.missionaryLeft = missionaryLeft;
  20. this.boat = boat;
  21. this.cannibalRight = cannibalRight;
  22. this.missionaryRight = missionaryRight;
  23. }
  24.  
  25. public boolean isGoal() {
  26. return cannibalLeft == 0 && missionaryLeft == 0;
  27. }
  28.  
  29. public boolean isValid() {
  30. if (missionaryLeft >= 0 && missionaryRight >= 0 && cannibalLeft >= 0 && cannibalRight >= 0
  31. && (missionaryLeft == 0 || missionaryLeft >= cannibalLeft)
  32. && (missionaryRight == 0 || missionaryRight >= cannibalRight)) {
  33. return true;
  34. }
  35. return false;
  36. }
  37.  
  38. public List<State> generateSuccessors() {
  39. List<State> successors = new ArrayList<State>();
  40. if (boat == Position.LEFT) {
  41. testAndAdd(successors, new State(cannibalLeft, missionaryLeft - 2, Position.RIGHT,
  42. cannibalRight, missionaryRight + 2)); // Two missionaries cross left to right.
  43. testAndAdd(successors, new State(cannibalLeft - 2, missionaryLeft, Position.RIGHT,
  44. cannibalRight + 2, missionaryRight)); // Two cannibals cross left to right.
  45. testAndAdd(successors, new State(cannibalLeft - 1, missionaryLeft - 1, Position.RIGHT,
  46. cannibalRight + 1, missionaryRight + 1)); // One missionary and one cannibal cross left to right.
  47. testAndAdd(successors, new State(cannibalLeft, missionaryLeft - 1, Position.RIGHT,
  48. cannibalRight, missionaryRight + 1)); // One missionary crosses left to right.
  49. testAndAdd(successors, new State(cannibalLeft - 1, missionaryLeft, Position.RIGHT,
  50. cannibalRight + 1, missionaryRight)); // One cannibal crosses left to right.
  51. } else {
  52. testAndAdd(successors, new State(cannibalLeft, missionaryLeft + 2, Position.LEFT,
  53. cannibalRight, missionaryRight - 2)); // Two missionaries cross right to left.
  54. testAndAdd(successors, new State(cannibalLeft + 2, missionaryLeft, Position.LEFT,
  55. cannibalRight - 2, missionaryRight)); // Two cannibals cross right to left.
  56. testAndAdd(successors, new State(cannibalLeft + 1, missionaryLeft + 1, Position.LEFT,
  57. cannibalRight - 1, missionaryRight - 1)); // One missionary and one cannibal cross right to left.
  58. testAndAdd(successors, new State(cannibalLeft, missionaryLeft + 1, Position.LEFT,
  59. cannibalRight, missionaryRight - 1)); // One missionary crosses right to left.
  60. testAndAdd(successors, new State(cannibalLeft + 1, missionaryLeft, Position.LEFT,
  61. cannibalRight - 1, missionaryRight)); // One cannibal crosses right to left.
  62. }
  63. return successors;
  64. }
  65.  
  66. private void testAndAdd(List<State> successors, State newState) {
  67. if (newState.isValid()) {
  68. newState.setParentState(this);
  69. successors.add(newState);
  70. }
  71. }
  72.  
  73. public int getCannibalLeft() {
  74. return cannibalLeft;
  75. }
  76.  
  77. public void setCannibalLeft(int cannibalLeft) {
  78. this.cannibalLeft = cannibalLeft;
  79. }
  80.  
  81. public int getMissionaryLeft() {
  82. return missionaryLeft;
  83. }
  84.  
  85. public void setMissionaryLeft(int missionaryLeft) {
  86. this.missionaryLeft = missionaryLeft;
  87. }
  88.  
  89. public int getCannibalRight() {
  90. return cannibalRight;
  91. }
  92.  
  93. public void setCannibalRight(int cannibalRight) {
  94. this.cannibalRight = cannibalRight;
  95. }
  96.  
  97. public int getMissionaryRight() {
  98. return missionaryRight;
  99. }
  100.  
  101. public void setMissionaryRight(int missionaryRight) {
  102. this.missionaryRight = missionaryRight;
  103. }
  104.  
  105. public void goToLeft() {
  106. boat = Position.LEFT;
  107. }
  108.  
  109. public void goToRight() {
  110. boat = Position.RIGHT;
  111. }
  112.  
  113. public boolean isOnLeft() {
  114. return boat == Position.LEFT;
  115. }
  116.  
  117. public boolean isOnRigth() {
  118. return boat == Position.RIGHT;
  119. }
  120.  
  121. public State getParentState() {
  122. return parentState;
  123. }
  124.  
  125. public void setParentState(State parentState) {
  126. this.parentState = parentState;
  127. }
  128.  
  129. @Override
  130. public String toString() {
  131. if (boat == Position.LEFT) {
  132. return "(" + cannibalLeft + "," + missionaryLeft + ",L,"
  133. + cannibalRight + "," + missionaryRight + ")";
  134. } else {
  135. return "(" + cannibalLeft + "," + missionaryLeft + ",R,"
  136. + cannibalRight + "," + missionaryRight + ")";
  137. }
  138. }
  139.  
  140. @Override
  141. public boolean equals(Object obj) {
  142. if (!(obj instanceof State)) {
  143. return false;
  144. }
  145. State s = (State) obj;
  146. return (s.cannibalLeft == cannibalLeft && s.missionaryLeft == missionaryLeft
  147. && s.boat == boat && s.cannibalRight == cannibalRight
  148. && s.missionaryRight == missionaryRight);
  149. }
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement