不自由なハノイの塔(再帰版)

 投稿者:しばっち  投稿日:2020年 6月11日(木)19時25分12秒
  不自由なハノイの塔(再帰版)

●条件
1枚目は真ん中に置けない

移動回数 2*3^(N-1)-1

PUBLIC NUMERIC COUNT
LET N=3
CALL HANOI(N,1,2,3)
END

EXTERNAL  SUB HANOI(N,A,B,C) !' N>=1
IF N=1 THEN
   CALL DISPLAY(N,A,C)
ELSE
   CALL HANOI(N-1,A,B,C)
   CALL DISPLAY(N,A,B)
   CALL HANOI(N-1,C,B,A)
   CALL DISPLAY(N,B,C)
   CALL HANOI(N-1,A,B,C)
END IF
END SUB

EXTERNAL  SUB DISPLAY(N,A,B)
LET COUNT=COUNT+1
PRINT "No.";COUNT;N;"枚目を ";MID$("ABC",A,1);" から ";MID$("ABC",B,1);" へ"
END SUB


         実行結果

No. 1  1 枚目を A から C へ
No. 2  2 枚目を A から B へ
No. 3  1 枚目を C から A へ
No. 4  2 枚目を B から C へ
No. 5  1 枚目を A から C へ
No. 6  3 枚目を A から B へ
No. 7  1 枚目を C から A へ
No. 8  2 枚目を C から B へ
No. 9  1 枚目を A から C へ
No. 10  2 枚目を B から A へ
No. 11  1 枚目を C から A へ
No. 12  3 枚目を B から C へ
No. 13  1 枚目を A から C へ
No. 14  2 枚目を A から B へ
No. 15  1 枚目を C から A へ
No. 16  2 枚目を B から C へ
No. 17  1 枚目を A から C へ
 

不自由なハノイの塔(再帰版)

 投稿者:しばっち  投稿日:2020年 6月11日(木)19時26分0秒
  不自由なハノイの塔(再帰版)

●条件
2枚目は真ん中に置けない(n>=2)

移動回数 4*3^(N-2)-1

PUBLIC NUMERIC COUNT,S(7,3),NN
PUBLIC STRING D$(0 TO 7)
LET NN=3 !' NN>=2
MAT READ D$
PRINT "円盤";NN;"枚"
PRINT "No. 0"
FOR K=1 TO NN
   LET S(K,1)=1
   PRINT D$(K)
NEXT K
CALL HANOI(NN,1,2,3)
DATA "                              "
DATA "              ■              "
DATA "            ■■■            "
DATA "          ■■■■■          "
DATA "        ■■■■■■■        "
DATA "      ■■■■■■■■■      "
DATA "    ■■■■■■■■■■■    "
DATA "  ■■■■■■■■■■■■■  "
END

EXTERNAL  SUB HANOI(N,A,B,C) !' N>=2
IF N=2 THEN
   CALL DISPLAY(1,A,B)
   CALL DISPLAY(2,A,C)
   CALL DISPLAY(1,B,C)
ELSE
   CALL HANOI(N-1,A,B,C)
   CALL DISPLAY(N,A,B)
   CALL HANOI(N-1,C,B,A)
   CALL DISPLAY(N,B,C)
   CALL HANOI(N-1,A,B,C)
END IF
END SUB

EXTERNAL  SUB DISPLAY(N,A,B)
LET S(N,A)=0
LET S(N,B)=1
PRINT REPEAT$("-",LEN(D$(0))*3)
LET COUNT=COUNT+1
PRINT "No.";COUNT
FOR J=1 TO NN
   FOR K=1 TO 3
      IF S(J,K)=1 THEN
         PRINT D$(J)
         EXIT FOR
      END IF
      PRINT D$(0);
   NEXT K
NEXT J
END SUB


            実行結果

円盤 3 枚
No. 0
            ■
          ■■■
        ■■■■■
------------------------------------------------------------------------------
No. 1
                                      ■
          ■■■
        ■■■■■
------------------------------------------------------------------------------
No. 2
                                      ■
                                                              ■■■
        ■■■■■
------------------------------------------------------------------------------
No. 3
                                                                ■
                                                              ■■■
        ■■■■■
------------------------------------------------------------------------------
No. 4
                                                                ■
                                                              ■■■
                                  ■■■■■
------------------------------------------------------------------------------
No. 5
                                      ■
                                                              ■■■
                                  ■■■■■
------------------------------------------------------------------------------
No. 6
                                      ■
          ■■■
                                  ■■■■■
------------------------------------------------------------------------------
No. 7
            ■
          ■■■
                                  ■■■■■
------------------------------------------------------------------------------
No. 8
            ■
          ■■■
                                                            ■■■■■
------------------------------------------------------------------------------
No. 9
                                      ■
          ■■■
                                                            ■■■■■
------------------------------------------------------------------------------
No. 10
                                      ■
                                                              ■■■
                                                            ■■■■■
------------------------------------------------------------------------------
No. 11
                                                                ■
                                                              ■■■
                                                            ■■■■■
 

不自由なハノイの塔(再帰版)

 投稿者:しばっち  投稿日:2020年 6月11日(木)19時26分49秒
  不自由なハノイの塔(再帰版)

●条件
m枚目は真ん中に置けない(n>=m)

移動回数 2^m*3^(n-m)-1

PUBLIC NUMERIC COUNT,INIT,NN
CALL GINIT(800,400)
INPUT  PROMPT "枚数=":NN
INPUT  PROMPT "真ん中に置けない円盤 No.=":M
FOR I=1 TO NN
   CALL DISPLAY(I,2,1)
NEXT I
LET INIT=1
WAIT DELAY .5
CALL HANOI(NN,M,1,2,3)
END

EXTERNAL  SUB HANOI(N,M,A,B,C) !' N>=M
IF N<=M THEN
   CALL HANOI_SUB(N,A,B,C)
ELSE
   CALL HANOI(N-1,M,A,B,C)
   CALL DISPLAY(N,A,B)
   CALL HANOI(N-1,M,C,B,A)
   CALL DISPLAY(N,B,C)
   CALL HANOI(N-1,M,A,B,C)
END IF
END SUB

EXTERNAL  SUB HANOI_SUB(N,A,B,C)
IF N>0 THEN
   CALL HANOI_SUB(N-1,A,C,B)
   CALL DISPLAY(N,A,C)
   CALL HANOI_SUB(N-1,B,A,C)
END IF
END SUB

EXTERNAL  SUB DISPLAY(N,A,B)
IF INIT=1 THEN
   LET COUNT=COUNT+1
   PLOT TEXT,AT 30,0:"No."&STR$(COUNT)
   WAIT DELAY 1/10
END IF
LET HEIGHT=INT(330/NN)
LET WIDTH=INT(180/NN)
CALL BOXFULL(200*A-WIDTH/2*N,50+HEIGHT*(N-1),200*A+WIDTH/2*N,50+HEIGHT*N,0)
CALL BOXFULL(200*B-WIDTH/2*N,50+HEIGHT*(N-1),200*B+WIDTH/2*N,50+HEIGHT*N,7)
END SUB

EXTERNAL SUB GINIT(XSIZE,YSIZE)
SET BITMAP SIZE XSIZE,YSIZE
SET WINDOW 0,XSIZE-1,YSIZE-1,0
SET POINT STYLE 1
SET COLOR MODE "REGULAR"
SET COLOR MIX(0) 0,0,0
SET COLOR MIX(1) 0,0,1
SET COLOR MIX(2) 1,0,0
SET COLOR MIX(3) 1,0,1
SET COLOR MIX(4) 0,1,0
SET COLOR MIX(5) 0,1,1
SET COLOR MIX(6) 1,1,0
SET COLOR MIX(7) 1,1,1
SET TEXT HEIGHT 20
SET TEXT JUSTIFY "LEFT" , "TOP"
SET TEXT BACKGROUND "OPAQUE"
SET TEXT COLOR 7
CLEAR
END SUB

EXTERNAL SUB BOXFULL(X1,Y1,X2,Y2,C)
SET COLOR C
PLOT AREA:X1,Y1;X2,Y1;X2,Y2;X1,Y2;X1,Y1
END SUB
 

戻る