以前用QB写的算迷宫路径的程序(广度搜索):
DIM MGData(0 TO 999) AS INTEGER
DIM X AS INTEGER, Y AS INTEGER
DIM CurView(0 TO 33) AS INTEGER
DIM CurX AS INTEGER, CurY AS INTEGER
DIM ik AS STRING
DIM I AS INTEGER, J AS INTEGER
DIM OldX AS INTEGER, OldY AS INTEGER
DIM L AS INTEGER, MGX(I) AS INTEGER, MGY(I) AS INTEGER
DIM Pic1(0 TO 33) AS INTEGER, Pic2(0 TO 33) AS INTEGER, Pic3(0 TO 33) AS INTEGER, Pic4(0 TO 33) AS INTEGERSCREEN 13LINE (0, 0)-(7, 7), 15, B
GET (0, 0)-(7, 7), CurViewCONST FXC = 8
LINE (8 + 3, 0)-STEP(1, 7), FXC, B
LINE (8 + 2, 1)-STEP(3, 0), FXC
LINE (8 + 1, 2)-STEP(5, 0), FXC
GET (8, 0)-STEP(7, 7), Pic1
LINE (16 + 3, 0)-STEP(1, 7), FXC, B
LINE (16 + 2, 6)-STEP(3, 0), FXC
LINE (16 + 1, 5)-STEP(5, 0), FXC
GET (16, 0)-STEP(7, 7), Pic2
LINE (24, 3)-STEP(7, 1), FXC, B
LINE (24 + 1, 2)-STEP(0, 3), FXC
LINE (24 + 2, 1)-STEP(0, 5), FXC
GET (24, 0)-STEP(7, 7), Pic3
LINE (32, 3)-STEP(7, 1), FXC, B
LINE (32 + 6, 2)-STEP(0, 3), FXC
LINE (32 + 5, 1)-STEP(0, 5), FXC
GET (32, 0)-STEP(7, 7), Pic4'WHILE INKEY$ = "": WEND
CLSStart:
FOR I = 1 TO 999
    MGData(I) = &H7FFF
NEXT I
LINE (0, 0)-STEP(7, 7), 10, BF
LINE (312, 192)-STEP(7, 7), 10, BF
PUT (CurX, CurY), CurView, XORDO
    ik = INKEY$
    SELECT CASE ik$
    CASE CHR$(27)
        EXIT DO    CASE " "
        PUT (CurX, CurY), CurView, XOR
        IF POINT(CurX, CurY) = 0 THEN
            LINE (CurX, CurY)-STEP(7, 7), 13, BF
            LINE (CurX, CurY)-STEP(7, 7), 5, B
        ELSEIF POINT(CurX, CurY) = 5 THEN
            LINE (CurX, CurY)-STEP(7, 7), 0, BF
        END IF
        PUT (CurX, CurY), CurView, XOR    CASE CHR$(0) + CHR$(72)
        IF CurY > 0 THEN
            PUT (CurX, CurY), CurView, XOR
            CurY = CurY - 8
            PUT (CurX, CurY), CurView, XOR        END IF    CASE CHR$(0) + CHR$(80)
        IF CurY < 192 THEN
            PUT (CurX, CurY), CurView, XOR
            CurY = CurY + 8
            PUT (CurX, CurY), CurView, XOR        END IF    CASE CHR$(0) + CHR$(75)
        IF CurX > 0 THEN
            PUT (CurX, CurY), CurView, XOR
            CurX = CurX - 8
            PUT (CurX, CurY), CurView, XOR        END IF    CASE CHR$(0) + CHR$(77)
        IF CurX < 312 THEN
            PUT (CurX, CurY), CurView, XOR
            CurX = CurX + 8
            PUT (CurX, CurY), CurView, XOR        END IF    CASE CHR$(0) + CHR$(141) 'Ctrl+Up
        IF CurY > 0 THEN
            PUT (CurX, CurY), CurView, XOR
            IF POINT(CurX, CurY) = 0 THEN
                LINE (CurX, CurY)-STEP(7, 7), 13, BF
                LINE (CurX, CurY)-STEP(7, 7), 5, B
            ELSEIF POINT(CurX, CurY) = 5 THEN
                LINE (CurX, CurY)-STEP(7, 7), 0, BF
            END IF
            CurY = CurY - 8
            PUT (CurX, CurY), CurView, XOR        END IF    CASE CHR$(0) + CHR$(145) 'Ctrl+Down
        IF CurY < 192 THEN
            PUT (CurX, CurY), CurView, XOR
            IF POINT(CurX, CurY) = 0 THEN
                LINE (CurX, CurY)-STEP(7, 7), 13, BF
                LINE (CurX, CurY)-STEP(7, 7), 5, B
            ELSEIF POINT(CurX, CurY) = 5 THEN
                LINE (CurX, CurY)-STEP(7, 7), 0, BF
            END IF
            CurY = CurY + 8
            PUT (CurX, CurY), CurView, XOR        END IF    CASE CHR$(0) + CHR$(115) 'Ctrl+Left
        IF CurX > 0 THEN
            PUT (CurX, CurY), CurView, XOR
            IF POINT(CurX, CurY) = 0 THEN
                LINE (CurX, CurY)-STEP(7, 7), 13, BF
                LINE (CurX, CurY)-STEP(7, 7), 5, B
            ELSEIF POINT(CurX, CurY) = 5 THEN
                LINE (CurX, CurY)-STEP(7, 7), 0, BF
            END IF
            CurX = CurX - 8
            PUT (CurX, CurY), CurView, XOR        END IF    CASE CHR$(0) + CHR$(116) 'Ctrl+Right
        IF CurX < 312 THEN
            PUT (CurX, CurY), CurView, XOR
            IF POINT(CurX, CurY) = 0 THEN
                LINE (CurX, CurY)-STEP(7, 7), 13, BF
                LINE (CurX, CurY)-STEP(7, 7), 5, B
            ELSEIF POINT(CurX, CurY) = 5 THEN
                LINE (CurX, CurY)-STEP(7, 7), 0, BF
            END IF
            CurX = CurX + 8
            PUT (CurX, CurY), CurView, XOR        END IF    CASE CHR$(0) + CHR$(60)'F2
        CLS
        GOTO Start

解决方案 »

  1.   

    CASE CHR$(0) + CHR$(63)'F5
            PUT (CurX, CurY), CurView, XOR
            I = 0
            DO
                L = 0
                FOR J = 0 TO 999
                    IF MGData(J) = I THEN
                        IF J = 999 THEN EXIT DO
                        X = J MOD 40: Y = INT(J / 40)
                        IF X - 1 >= 0 THEN
                            IF POINT((X - 1) * 8, Y * 8) <> 5 THEN
                                IF I + 1 < MGData((X - 1) + Y * 40) THEN
                                    MGData((X - 1) + Y * 40) = I + 1
                                    L = -1
                                END IF
                            END IF
                        END IF
                        IF Y - 1 >= 0 THEN
                            IF POINT(X * 8, (Y - 1) * 8) <> 5 THEN
                                IF I + 1 < MGData(X + (Y - 1) * 40) THEN
                                    MGData(X + (Y - 1) * 40) = I + 1
                                    L = -1
                                END IF
                            END IF
                        END IF
                        IF X + 1 <= 39 THEN
                            IF POINT((X + 1) * 8, Y * 8) <> 5 THEN
                                IF I + 1 < MGData((X + 1) + Y * 40) THEN
                                    MGData((X + 1) + Y * 40) = I + 1
                                    L = -1
                                END IF
                            END IF
                        END IF
                        IF Y + 1 <= 24 THEN
                            IF POINT(X * 8, (Y + 1) * 8) <> 5 THEN
                                IF I + 1 < MGData(X + (Y + 1) * 40) THEN
                                    MGData(X + (Y + 1) * 40) = I + 1
                                    L = -1
                                END IF
                            END IF
                        END IF                END IF            NEXT J
                I = I + 1
                IF L = 0 THEN MGData(999) = 0: EXIT DO
            LOOP
            IF MGData(999) THEN
                L = MGData(999) - 1
                REDIM MGX(0 TO L) AS INTEGER
                REDIM MGY(0 TO L) AS INTEGER
                MGX(L) = 39: MGY(L) = 24
                DO WHILE L
                    X = MGX(L)
                    Y = MGY(L)
                    DO
                        IF Y - 1 >= 0 THEN
                            IF MGData(X + (Y - 1) * 40) = L THEN
                                L = L - 1
                                MGX(L) = X
                                MGY(L) = Y - 1
                                MGData(X + (Y - 1) * 40) = &H7FFF
                                EXIT DO
                            END IF
                        END IF
                        IF X - 1 >= 0 THEN
                            IF MGData((X - 1) + Y * 40) = L THEN
                                L = L - 1
                                MGX(L) = X - 1
                                MGY(L) = Y
                                MGData((X - 1) + Y * 40) = &H7FFF
                                EXIT DO
                            END IF
                        END IF
                        IF Y + 1 <= 24 THEN
                            IF MGData(X + (Y + 1) * 40) = L THEN
                                L = L - 1
                                MGX(L) = X
                                MGY(L) = Y + 1
                                MGData(X + (Y + 1) * 40) = &H7FFF
                                EXIT DO
                            END IF
                        END IF
                        IF X + 1 <= 39 THEN
                            IF MGData((X + 1) + Y * 40) = L THEN
                                L = L - 1
                                MGX(L) = X + 1
                                MGY(L) = Y
                                MGData((X + 1) + Y * 40) = &H7FFF
                                EXIT DO
                            END IF
                        END IF
                        L = L + 1
                    LOOP WHILE 0
                LOOP
                X = 0: Y = 0
                FOR I = 0 TO UBOUND(MGX) - 1
                    LINE (MGX(I) * 8, MGY(I) * 8)-STEP(7, 7), 2, BF
                    IF MGX(I) = X THEN
                        IF MGY(I) > Y THEN
                            PUT (MGX(I) * 8, MGY(I) * 8), Pic2, XOR
                        ELSE
                            PUT (MGX(I) * 8, MGY(I) * 8), Pic1, XOR
                        END IF
                    ELSE
                        IF MGX(I) > X THEN
                            PUT (MGX(I) * 8, MGY(I) * 8), Pic4, XOR
                        ELSE
                            PUT (MGX(I) * 8, MGY(I) * 8), Pic3, XOR
                        END IF
                    END IF
                    X = MGX(I)
                    Y = MGY(I)
                NEXT I
            ELSE
                LOCATE 1, 1
                PRINT "No!"
            END IF
            BEEP
            WHILE INKEY$ = "": WEND
            FOR I = 0 TO 39
                FOR J = 0 TO 24
                    IF POINT(I * 8, J * 8) <> 5 THEN LINE (I * 8, J * 8)-STEP(7, 7), 0, BF
                NEXT J
            NEXT I
            GOTO Start
        END SELECTLOOPEND