Comment detail

水の移し替えパズル (Nested Flatten)
一箇所に水が集まるということは、その前の段階では残り二箇所は同じ数字になっている。
ならば、どうやって同じ数字にするか、と考えると2箇所から1を引いて残り一箇所に2を足すと考えると、3ずつしか差分は動かない。
よって差が3の倍数である組に注目する。
手順としてはその組の大きい数字を0にする作業となるので差が3の倍数である組の最大値が回答になる。
差が3の倍数の組が二つある場合は小さいほうの組でよい。

ってことで、こうなりました。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <stdlib.h>

long water_move(long a,long b,long c){
    long ret=-1;
    
    if((a-b)%3==0)
        ret=max(a,b);
    if((a-c)%3==0)
        if(ret==-1) ret=max(a,c);
        else ret=min(ret,max(a,c));
    if((b-c)%3==0)
        if(ret==-1) ret=max(b,c);
        else ret=min(ret,max(b,c));
    
    return ret;
}

void put_water_move(long a,long b, long c){
    int ret;
    
    ret=water_move(a,b,c);
    printf("A=%ld B=%ld C=%ld : ");
    if (ret==-1)
        printf("出来ません\n");
    else
        printf("%ld\n",ret);
}

int main(){
    put_water_move(4,2,10);
    put_water_move(827392,65536,122880);
    put_water_move(4,2,6);
    put_water_move(4,1,10);
    
    return 0;
}
gccだとmax、minが未定義って怒られました。
あとA、B、C、をprintfしてる所の引数が足りなくないですか?
max、minマクロってstdlibで定義されてるもんじゃなかったんでしたっけ?

引数は・・・書き忘れてます^^;; 
自分とこではたまたま、スタック上に残ってて動いたようですw
vc++のclだとコンパイルできました。

max,minは少なくともANSI Cにはないと思います。
vcの独自拡張かMS-DOS近辺の文化かどっちかなのかなあ。
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

Index

Feed

Other

Link

Pathtraq

loading...