10-03-2003, 07:31 AM
This was my solution (slightly modified):I also have Aga's solution, but I'll allow him to post it.
Code:
DEFINT A-Z
DECLARE SUB DsplMove (Grp%, j%, Pstn%(), LnUp$, Mv$, Move%)
DIM LineUp AS STRING
SCREEN 0
WIDTH 80, 25
DO
VIEW PRINT
CLS
Title$ = "Kangaroo Problem"
LOCATE 1, 32
PRINT Title$; TAB(2); STRING$(78, "=")
DO '============================== User Input ==========================
LOCATE 10, 18
INPUT "Enter the number of kangaroos per side: ", n
Okay = 0
IF n < 10 THEN
Okay = -1
ELSE
LOCATE 13, 1
IF n > 31 THEN
PRINT TAB(22); "Can't display more than 31 kangaroos.";
Txt$ = "(You really didn't want to watch"
Txt$ = Txt$ + STR$(n * (n + 2)) + " moves anyway)"
PRINT TAB(40 - LEN(Txt$) \ 2); Txt$
DO: k$ = INKEY$: LOOP WHILE k$ = ""
ELSE
Txt$ = "This will require" + STR$(n * (n + 2))
Txt$ = Txt$ + " moves. Use n =" + STR$(n) + "? (y/n)"
PRINT TAB(40 - LEN(Txt$) \ 2); Txt$
DO: k$ = LCASE$(INKEY$): LOOP UNTIL k$ = "y" OR k$ = "n"
Okay = (k$ = "y")
END IF
LOCATE 10, 1: PRINT STRING$(80, " ")
LOCATE 13, 1: PRINT STRING$(80, " ")
LOCATE 14, 1: PRINT STRING$(80, " ")
END IF
LOOP UNTIL Okay '============ End User Input ==========================
CLS '----------------------- set up solution screen -----------------
T$ = Title$ + " (n =" + STR$(n) + ")"
LOCATE 1, 41 - LEN(T$) \ 2
PRINT T$; TAB(2); STRING$(78, "=")
VIEW PRINT 3 TO 24 '----------- End set up solution screen --------------
REDIM Pstn(1, 1 TO n) ' position of each kangaroo
FOR i = 1 TO n ' starting from 1 on left
Pstn(0, i) = n + 1 - i
Pstn(1, i) = n + 1 + i
NEXT
LineUp = STRING$(n, ">") + "_" + STRING$(n, "<")
Move = 0
DsplMove Group, j, Pstn(), LineUp, "", Move
FOR i = 0 TO n - 1
Group = i MOD 2
FOR j = 1 TO i
DsplMove Group, j, Pstn(), LineUp, "jump", Move
NEXT
DsplMove Group, i + 1, Pstn(), LineUp, "hop ", Move
NEXT
Group = n MOD 2
FOR j = 1 TO n
DsplMove Group, j, Pstn(), LineUp, "jump", Move
NEXT
FOR i = n - 1 TO 0 STEP -1
Group = i MOD 2
DsplMove Group, n - i, Pstn(), LineUp, "hop ", Move
FOR j = 1 TO i
DsplMove Group, n - i + j, Pstn(), LineUp, "jump", Move
NEXT
NEXT
PRINT TAB(28); "Try a different value? (y/n)";
DO: k$ = LCASE$(INKEY$): LOOP UNTIL k$ = "y" OR k$ = "n"
LOOP WHILE k$ = "y"
SUB DsplMove (Grp, j, Pstn(), LnUp$, Mv$, Move)
IF Grp = 0 THEN
Char$ = ">"
Grp$ = "R"
Drctn = 1
ELSE
Char$ = "<"
Grp$ = "L"
Drctn = -1
END IF
Dspl$ = RIGHT$(" " + STR$(Move), 4) + ") "
IF Move = 0 THEN
Dspl$ = Dspl$ + STRING$(10, " ") + LnUp$
ELSE
MvLngth = 1 - (Mv$ = "jump")
MID$(LnUp$, Pstn(Grp, j), 1) = "_"
MID$(LnUp$, Pstn(Grp, j) + MvLngth * Drctn, 1) = Char$
Pstn(Grp, j) = Pstn(Grp, j) + MvLngth * Drctn
Dspl$ = Dspl$ + Grp$ + LEFT$(RIGHT$(STR$(j) + " ", 2 - (j > 9)), 2)
Dspl$ = Dspl$ + " " + Mv$ + " " + LnUp$
END IF
PRINT TAB(40 - LEN(Dspl$) \ 2); Dspl$;
IF Move > 0 AND Move MOD 20 = 0 THEN
PRINT TAB(23); "PAUSED - Press any key to continue";
DO: k$ = INKEY$: LOOP WHILE k$ = ""
IF k$ = "q" OR k$ = CHR$(27) THEN END
LOCATE 24, 23: PRINT ; " ";
LOCATE 24, 1
END IF
Move = Move + 1
END SUB
hrist Jesus came into the world to save sinners, of whom I am first.(I Timothy 1:15)
For God so loved the world, that He gave His only begotten Son,
that whoever believes in Him should not perish, but have eternal life.(John 3:16)
For God so loved the world, that He gave His only begotten Son,
that whoever believes in Him should not perish, but have eternal life.(John 3:16)