challenge 水の移し替えパズル

A, B, Cの容器があり,それぞれ水が4L, 2L, 10L入っている. ここで次の操作を繰り返す.

(*)「A, B, Cのどれか二つの容器から水を1Lずつくみ上げ,残りの容器に移す.」

たとえばA, Bから1Lずつくみ上げて移せばA=3L, B=1L, C=12Lとなる. くみ上げる前の容器には必ず水が入っているとする.

(*)を繰り返してどれか一つの容器にのみ水がはいっている状態にする最小手数を求めよ.

可能ならA=827392L,B=65536L,C=122880Lのときも求めよ.


このお題は光成さんの投稿を元に作成しました。ご協力ありがとうございます。

Posted feedbacks - diff

math.h にもないかな?
#gcc だとwin32api/windef.h にあるらしい

まぁなければ作ればよいという事で差分。。。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
--- b.c.org    2007-10-30 13:52:04.546875000 +0900
+++ b.c    2007-10-30 13:52:41.421875000 +0900
@@ -1,5 +1,7 @@
 #include <stdio.h>
-#include <stdlib.h>
+
+#define max(a,b) ((a)>(b)?(a):(b))
+#define min(a,b) ((a)<(b)?(a):(b))
 
 long water_move(long a,long b,long c){
     long ret=-1;
@@ -20,7 +22,7 @@
     int ret;
     
     ret=water_move(a,b,c);
-    printf("A=%ld B=%ld C=%ld : ");
+    printf("A=%ld B=%ld C=%ld : ", a,b,c);
     if (ret==-1)
         printf("出来ません\n");
     else

ちょこちょことバグかあるので修正
それにしても、よくcoreをはかず動いていたものです^;;
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
--- doukaku73.c.org    2007-10-29 22:26:48.875000000 +0900
+++ doukaku73_2.c    2007-10-30 20:51:49.375000000 +0900
@@ -9,9 +9,9 @@
   while( is_changed == 1 )
   {
     is_changed = 0;
-    if( (*(baket[0])) < (*(baket[2])) ){ BAKET_SWAP(baket[0], baket[2]); is_changed = 1;}
-    if( (*(baket[0])) < (*(baket[1])) ){ BAKET_SWAP(baket[0], baket[1]); is_changed = 1;}
-    if( (*(baket[1])) < (*(baket[2])) ){ BAKET_SWAP(baket[1], baket[2]); is_changed = 1;}
+    if( *(*(baket[0])) < *(*(baket[2])) ){ BAKET_SWAP(*(baket[0]), *(baket[2])); is_changed = 1;}
+    if( *(*(baket[0])) < *(*(baket[1])) ){ BAKET_SWAP(*(baket[0]), *(baket[1])); is_changed = 1;}
+    if( *(*(baket[1])) < *(*(baket[2])) ){ BAKET_SWAP(*(baket[1]), *(baket[2])); is_changed = 1;}
   }
 }
 
@@ -37,7 +37,7 @@
     }
     if( B == C )
     {
-      printf("のこるのは B\n");
+      printf("のこるのは A\n");
       count += B;
       break;
     }

Index

Feed

Other

Link

Pathtraq

loading...