Advertisement
KolosAISD

MisjonarzeLudozercyGT

Nov 18th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.50 KB | None | 0 0
  1. class MisjonarzeLudozercyGT
  2. {
  3. final static int MAX_DLUGOSC_DROGI = 15; // max długość drogi + 1
  4. static Stan[] droga = new Stan[MAX_DLUGOSC_DROGI];
  5. static Stan[] minDroga = new Stan[MAX_DLUGOSC_DROGI];
  6. static int minDlugoscDrogi = MAX_DLUGOSC_DROGI;
  7.  
  8. public static void main(String[] args)
  9. {
  10. przewiez(false,0,0,0);
  11. for (int i = 0; i < minDlugoscDrogi; i++) minDroga[i].wypiszStan();
  12. System.out.println();
  13. }
  14.  
  15. static void przewiez(boolean prawa, int m, int l, int i)
  16. {
  17. if (m != 0 && m != l && m != 3) return; // gdy nieprawidłowy stan
  18.  
  19. if (i+1 == minDlugoscDrogi) return; // i+1 -- długość drogi
  20.  
  21. droga[i] = new Stan(prawa,m,l);
  22.  
  23. if (m == 3 && l == 3)
  24. {
  25. if (minDlugoscDrogi > i+1)
  26. {
  27. minDlugoscDrogi = i+1;
  28. for (int j = 0; j < minDlugoscDrogi; j++) minDroga[j] = droga[j];
  29. }
  30. }
  31. else
  32. {
  33. if (!prawa && m < 3) // przepłynięcie misjonarza na prawy brzeg
  34. przewiez(!prawa,m+1,l,i+1);
  35. if (prawa && m > 0) // przepłynięcie misjonarza na lewy brzeg
  36. przewiez(!prawa,m-1,l,i+1);
  37. if (!prawa && l < 3) // przepłynięcie ludożercy na prawy brzeg
  38. przewiez(!prawa,m,l+1,i+1);
  39. if (prawa && l > 0) // przepłynięcie ludożercy na lewy brzeg
  40. przewiez(!prawa,m,l-1,i+1);
  41. if (!prawa && m < 2) // przepłynięcie 2 misjonarzy na prawy brzeg
  42. przewiez(!prawa,m+2,l,i+1);
  43. if (prawa && m > 1) // przepłynięcie 2 misjonarzy na lewy brzeg
  44. przewiez(!prawa,m-2,l,i+1);
  45. if (!prawa && l < 2) // przepłynięcie 2 ludożerców na prawy brzeg
  46. przewiez(!prawa,m,l+2,i+1);
  47. if (prawa && l > 1) // przepłynięcie 2 ludożerców na lewy brzeg
  48. przewiez(!prawa,m,l-2,i+1);
  49. if (!prawa && m < 3 && l < 3) // przepłynięcie misjonarza i ludożercy na prawy b.
  50. przewiez(!prawa,m+1,l+1,i+1);
  51. if (prawa && m > 0 & l > 0) // przepłynięcie misjonarza i ludożercy na lewy b.
  52. przewiez(!prawa,m-1,l-1,i+1);
  53. }
  54. }
  55. }
  56. class Stan
  57. {
  58. boolean prawa; // strona po której znajduje się łódka
  59. int m, l; // liczba misjonarzy i ludożerców po prawej stronie rzeki
  60.  
  61. Stan(boolean prawa, int m, int l)
  62. {
  63. this.prawa = prawa;
  64. this.m = m;
  65. this.l = l;
  66. }
  67.  
  68. void wypiszStan()
  69. {
  70. System.out.println((3-m) + " " + (3-l) + (prawa ? " \21 " : " \20 ") + m + " " + l);
  71. }
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement