PROGRAM MAZE COMMON L(64,64),MS,KM,N(4096) DATA NR1,NR2,KM/0,0,0/ LOGICAL*1 LR(64,64) C 10 TYPE 1000 ACCEPT 1010,NCELL IF(NCELL.LT.2.OR.NCELL.GT.63)GO TO 10 1000 FORMAT(1H0,'HOW MAY CELLS PER SIDE?'$) 1010 FORMAT(I5) MS=4090/NCELL NSIDE=MS*NCELL C TYPE 1020 ACCEPT 1010,NR 1020 FORMAT(1H ,'RANDOM NUMBER PLEASE:',$) NR=ABS(NR)+200 DO 20,I=1,NR 20 X=RAN(NR1,NR2) C TYPE 1030 ACCEPT 1010,NSPD CALL PLOT(9,NSPD,15) CALL PLOT(2,-2047,-2047) 1030 FORMAT(1H ,'WHAT SPEED?',$) C TYPE 1040 ACCEPT 1050,RAND 1040 FORMAT(1H0,'RANDOM THRESHOLD(0.0 TO 1.0)?',$) 1050 FORMAT(F6.0) C DO 30,I=1,64 DO 30,J=1,64 30 L(I,J)=0 DO 32,I=1,NCELL+1 L(I,1)=1 32 L(I,NCELL+1)=1 DO 34,J=2,NCELL L(1,J)=1 34 L(NCELL+1,J)=1 DO 36,I=1,4096 36 N(I)=0 NM=2 KM=0 CELLM=NCELL-1 IM=NCELL+1 JM=NCELL+1 DO 40,I=1,64 DO 40,J=1,64 40 LR(I,J)=.FALSE. C JEXIT=NCELL*RAN(NR1,NR2)+1 JSTART=NCELL*RAN(NR1,NR2)+1 CALL PLOT(0) CALL PLOT(8,-2048,2047,-2048,2047) CALL PLOT(3,0,0) CALL PLOT(5,NSIDE,0) CALL PLOT(5,NSIDE,(JEXIT-1)*MS) CALL PLOT(3,NSIDE,JEXIT*MS) CALL PLOT(5,NSIDE,NSIDE) CALL PLOT(5,0,NSIDE) CALL PLOT(5,0,JSTART*MS) CALL PLOT(3,0,(JSTART-1)*MS) CALL PLOT(5,0,0) C C Preparations Over Now. C Draw Horizontal Lines C DO 200,J=2,JM-1 !Over rows CALL PLOT(3,0,(J-1)*MS) DO 200,I=2,IM !Over colums IF(RAN(NR1,NR2).GT.RAND) GO TO 170 !Random skip IF(I.EQ.2) GO TO 130 IF(I.EQ.IM) GO TO 140 !RHS? IF(L(I-1,J).EQ.0) GO TO 150 !New Line L(I,J)=L(I-1,J) GO TO 190 130 L(I,J)=1 !LHS GO TO 190 140 IF(L(I-1,J).NE.0) GO TO 145 !RHS L(I-1,J)=1 GO TO 190 145 IF(L(I-1,J).EQ.1) GO TO 170 N(L(I-1,J))=1 !Old line, attach GO TO 190 150 L(I-1,J)=NM L(I,J)=NM NM=NM+1 GO TO 190 170 CALL PLOT(3,(I-1)*MS,(J-1)*MS) !Skip GO TO 200 190 CALL PLOT(5,(I-1)*MS,(J-1)*MS) !Draw 200 CONTINUE C C Horizontal Lines Done C Draw Vertical Lines C DO 300,IX=2,IM-1 DO 300,JX=2,JM 205 I=CELLM*RAN(NR1,NR2)+2 J=NCELL*RAN(NR1,NR2)+2 IF(LR(I,J))GO TO 205 LR(I,J)=.TRUE. NHI=TRACE(I,J) NLO=TRACE(I,J-1) IF(NLO.GT.1)GO TO 240 !n,x? IF(NLO.EQ.1)GO TO 220 !1,x IF(NHI.EQ.0) GO TO 210 !0,0? CALL DRAW(I,J,NHI,I,J-1) !0,1/n draw GO TO 300 210 CALL DRAW(I,J,NM,I,J) !0,0 Draw L(I,J-1)=L(I,J) NM=NM+1 GO TO 300 220 IF(NHI.EQ.1) GO TO 300 !1,1 Skip IF(NHI.EQ.0)GO TO 230 !1,0? N(NHI)=1 225 CALL PLOT(3,(I-1)*MS,(J-2)*MS) CALL PLOT(5,(I-1)*MS,(J-1)*MS) GO TO 300 230 CALL DRAW(I,J,1,I,J) !1,0 GO TO 300 !1,x all Done 240 IF(NHI.EQ.NLO) GO TO 300 !n,=n Skip IF(NHI.GT.1) GO TO 260 !n,n? IF(NHI.EQ.1) GO TO 250 !n,1? CALL DRAW(I,J,NLO,I,J) !n,0 GO TO 300 250 N(NLO)=1 !n,1 GO TO 225 260 M=MAX0(NHI,NLO) !n,n N(M)=MIN0(NHI,NLO) GO TO 225 !n,x all done 300 CONTINUE TYPE 1100,NM,KM D TYPE 1110,((L(I,J),I=1,IM),J=1,JM) 1100 FORMAT(1H ,'NM REACHED',I4,' KM REACHED',I4) 1110 FORMAT(1H ,15I4) CALL PLOT(1) GO TO 10 STOP END C C FUNCTION TRACE(I,J) DIMENSION NSAV(200) COMMON L(64,64),MS,KM,N(4096) NT=L(I,J) IF(NT.LT.2) GO TO 50 DO 10,K=1,200 NSAV(K)=NT IF(NT.GT.4095) GO TO 60 NT=N(NT) IF(NT.LT.2) GO TO 12 10 CONTINUE TYPE 1000,(NSAV(K),K=1,200) 1000 FORMAT(1H0,10I6) PAUSE 'FAILURE! KM>200' 12 IF(NT.EQ.0) GO TO 20 D DO 15,KL=1,K !Attached: reassign all D15 N(NSAV(KL))=1 !to 1. NT=1 GO TO 50 20 IF(K.GT.1) GO TO 30 !Not attached NT=NSAV(1) !Only 1 linkage. NT=n GO TO 50 30 CONTINUE D DO 35,KL=1,K-1 !Several links. Reassign D35 N(NSAV(KL))=NSAV(K) !All to root n NT=NSAV(K) 50 TRACE=NT IF(K.GT.KM)KM=K RETURN 60 TYPE 1010,NT,I,J 1010 FORMAT(1X,'NT=',I6,' AT I,J=',I3,','I3) STOP END C C SUBROUTINE DRAW(I,J,N,IN,JN) COMMON L(64,64),MS CALL PLOT(3,(I-1)*MS,(J-2)*MS) !Draw from below to CALL PLOT(5,(I-1)*MS,(J-1)*MS) !Point I,J L(IN,JN)=N !Attach line number to a point RETURN END