水の移し替えパズル
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;
}
|




にしお
#3547()
Rating0/2=0.00
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のときも求めよ.
このお題は光成さんの投稿を元に作成しました。ご協力ありがとうございます。
[ reply ]