!Takoma Park M.S.

!ACSL Jr. div

!Joel Muskin-Pieret

!

 

DO

   LINE INPUT prompt "node list: ":nodes$

   LET length  = len(nodes$)

   LET a = (length-3)/4

   DIM x(100)

   DIM y(100)

   IF not(val(nodes$[length:length]) = 0 and val(nodes$[length-2:length-2]) = 0) then

      PRINT "Node list invalid (does not end with 0,0)"

   END IF

LOOP until val(nodes$[length:length]) = 0 and val(nodes$[length-2:length-2]) = 0

FOR b = 1 to a

    LET x(b) = val(nodes$[4*b -3:4*b -3])

    LET y(b) = val(nodes$[4*b -1:4*b -1])

NEXT b

LET c = 0

LET d = 0

FOR b = 1 to a

    IF x(b) > c then LET c = x(b)

    IF y(b) > d then LET d = y(b)

NEXT b

DIM graph(30,30)

DIM visited(30,30)

FOR f = 1 to 30

    FOR g = 1 to 30

        LET graph(f,g) = 0

        LET visited(f,g) = 0

    NEXT g

NEXT f

FOR b  = 1 to a

    LET graph(x(b),y(b)) = 1

    LET visited(x(b),y(b)) = 1

NEXT b

DIM listx(100)

DIM listy(100)

DO

   INPUT prompt "start and end points (0,0,0,0 to end): ": sx, sy, ex, ey

   IF sx > 0 and sy > 0 and ex > 0 and ey > 0 then

      LET listx(1)=sx

      LET listy(1)=sy

      LET c = 1

      LET finish = 0

      LET output$ = ""

      FOR az = 1 to 30

          FOR b  = 1 to 30

              LET visited(az,b) = graph(az,b)

          NEXT b

      NEXT az

      LET visited(sx,sy) = 2

      IF sx <> ex and sy <> ey then

         DO

            LET d = 0

            LET e = 0

            FOR az =  -1 to 1

                FOR b = -1 to 1

                    IF az <> 0 or b <> 0 then

                       IF listx(c) + az > 0 and listy(c)+b > 0 then

                          IF visited(listx(c) + az,listy(c)+b) = 1 and e = 0 and c > 0 then

                             LET c = c + 1

                             LET e = 1

                             LET listx(c) = listx(c-1) + az

                             LET listy(c) = listy(c-1) + b

                             LET visited(listx(c-1) + az,listy(c-1)+b) = 2

                          ELSE

                             LET d  = d + 1

                          END IF

                       ELSE

                          LET d = d + 1

                       END IF

                    END IF

                NEXT b

            NEXT az

            IF d = 8 and c > 0 then

               LET listx(c) = 0

               LET listy(c) = 0

               LET c  = c - 1

            END IF

            IF c > 0 then

               IF listx(c) = ex and listy(c) = ey then

                  LET finish = 1

               END IF

            END IF

         LOOP until c = 0 or finish = 1

      END IF

      IF c  =  0 then

         PRINT "NONE"

      ELSE IF c > 1 then

         FOR b = 1 to c-1

             LET output$ = output$ & str$(listx(b)) & ","

             LET output$ = output$ & str$(listy(b)) & ","

         NEXT b

         LET output$ = output$ & str$(listx(c)) & "," & str$(listy(c))

         PRINT output$

      ELSE

         LET output$ = output$ & str$(listx(c)) & "," & str$(listy(c))

         PRINT output$

      END IF

   END IF

LOOP until sx = 0 and sy = 0 and ex = 0 and ey = 0

END