fork(2) download
  1. #include <stdio.h>
  2.  
  3. typedef struct
  4. {
  5. int canibales; // Numero de canibales en el barco
  6. int misioneros; // Numero de misioneros en el barco
  7. int ida; // A true si el barco hace el recorrido de ida, 0 en el caso de vuelta
  8. } Barco;
  9.  
  10. typedef struct
  11. {
  12. int canibales; // Numero de canibales en el barco
  13. int misioneros; // Numero de misioneros en el barco
  14. } Posicion;
  15.  
  16. void MoverAlBarco(Posicion * isla, Barco const* barco)
  17. {
  18. isla->canibales -= barco->canibales;
  19. isla->misioneros -= barco->misioneros;
  20. }
  21.  
  22. void MoverALaIsla(Posicion * isla, Barco const* barco)
  23. {
  24. isla->canibales += barco->canibales;
  25. isla->misioneros += barco->misioneros;
  26. }
  27.  
  28. void imprimirIsla(Posicion const* posicion)
  29. {
  30. printf("M:%d C:%d", posicion->misioneros, posicion->canibales);
  31. }
  32.  
  33. void imprimirBarco(Barco const* barco)
  34. {
  35. if( barco->ida )
  36. {
  37. printf("---->> \\_M:%d_C:%d_/ ", barco->misioneros, barco->canibales);
  38. }
  39. else
  40. {
  41. printf(" \\_M:%d_C:%d_/ <<----", barco->misioneros, barco->canibales);
  42. }
  43. }
  44.  
  45. int viajeValido(Posicion const* origen, Posicion const* destino, Barco const* barco)
  46. {
  47. int toReturn = (origen->misioneros - barco->misioneros >= 0)
  48. && (origen->canibales - barco->canibales >= 0);
  49.  
  50. if( toReturn && origen->misioneros - barco->misioneros != 0 )
  51. toReturn = (origen->canibales - barco->canibales <= origen->misioneros - barco->misioneros);
  52. if( toReturn && destino->misioneros + barco->misioneros != 0 )
  53. toReturn = (destino->canibales + barco->canibales <= destino->misioneros + barco->misioneros);
  54.  
  55. return toReturn;
  56. }
  57.  
  58. void imprimirEstado(Posicion const* inicio, Posicion const* fin, Barco const* barco)
  59. {
  60. imprimirIsla(inicio);
  61. printf(" | ");
  62. imprimirBarco(barco);
  63. printf(" | ");
  64. imprimirIsla(fin);
  65. printf("\n");
  66. }
  67.  
  68.  
  69. int main()
  70. {
  71. Posicion inicio = { 3, 3 };
  72. Posicion fin = { 0, 0 };
  73.  
  74. Barco const ida[] = { { 2, 0, 1 }, { 0, 2, 1 }, { 1, 1, 1 } };
  75. Barco const vuelta[] = { { 1, 0, 0 }, { 1, 1, 0 } };
  76. Barco const dummy = {0, 0, 1};
  77.  
  78. imprimirEstado(&inicio, &fin, &dummy);
  79. while(1)
  80. {
  81. for( int i=0; i<3; i++ )
  82. {
  83. Barco const* barco = &ida[i];
  84. if( viajeValido(&inicio, &fin, barco) )
  85. {
  86. MoverAlBarco(&inicio, barco);
  87. imprimirEstado(&inicio, &fin, barco);
  88. MoverALaIsla(&fin, barco);
  89. break;
  90. }
  91. }
  92.  
  93. if( fin.canibales == 3 && fin.misioneros == 3 )
  94. {
  95. imprimirEstado(&inicio, &fin, &dummy);
  96. break;
  97. }
  98.  
  99. for( int i=0; i<2; i++ )
  100. {
  101. Barco const* barco = &vuelta[i];
  102. if( viajeValido(&fin, &inicio, barco) )
  103. {
  104. MoverAlBarco(&fin, barco);
  105. imprimirEstado(&inicio, &fin, barco);
  106. MoverALaIsla(&inicio, barco);
  107. break;
  108. }
  109. }
  110. }
  111.  
  112. }
  113.  
Success #stdin #stdout 0s 4300KB
stdin
Standard input is empty
stdout
M:3 C:3 | ---->> \_M:0_C:0_/        | M:0 C:0
M:3 C:1 | ---->> \_M:0_C:2_/        | M:0 C:0
M:3 C:1 |        \_M:0_C:1_/ <<---- | M:0 C:1
M:3 C:0 | ---->> \_M:0_C:2_/        | M:0 C:1
M:3 C:0 |        \_M:0_C:1_/ <<---- | M:0 C:2
M:1 C:1 | ---->> \_M:2_C:0_/        | M:0 C:2
M:1 C:1 |        \_M:1_C:1_/ <<---- | M:1 C:1
M:0 C:2 | ---->> \_M:2_C:0_/        | M:1 C:1
M:0 C:2 |        \_M:0_C:1_/ <<---- | M:3 C:0
M:0 C:1 | ---->> \_M:0_C:2_/        | M:3 C:0
M:0 C:1 |        \_M:0_C:1_/ <<---- | M:3 C:1
M:0 C:0 | ---->> \_M:0_C:2_/        | M:3 C:1
M:0 C:0 | ---->> \_M:0_C:0_/        | M:3 C:3