Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PROGRAM DAY12
- IMPLICIT NONE
- INTEGER :: I,J,K,N,M,IERR,START,END
- CHARACTER(LEN=5) :: NAME,A,B
- CHARACTER(LEN=5), ALLOCATABLE :: CAVENAMES(:)
- CHARACTER(LEN=8), ALLOCATABLE :: CONNECTIONS(:)
- LOGICAL, ALLOCATABLE :: VISITED(:)
- INTEGER, ALLOCATABLE :: CONN(:,:)
- OPEN(1,FILE="input.txt")
- N=0
- DO
- READ(1,*,IOSTAT=IERR)
- IF(IERR.NE.0) EXIT
- N=N+1
- END DO
- REWIND(1)
- ALLOCATE(CONNECTIONS(N),CAVENAMES(2*N),CONN(2*N,2*N),VISITED(2*N))
- READ (1,*) CONNECTIONS
- CLOSE(1)
- CAVENAMES=""
- CAVENAMES(1) = "start"
- CONN=0
- M=2
- DO I=1,N
- NAME = CONNECTIONS(I)(1:SCAN(CONNECTIONS(I),"-")-1)
- IF((.NOT.ANY(CAVENAMES.EQ.NAME)).AND.(TRIM(NAME).NE."end")) THEN
- CAVENAMES(M) = NAME
- M=M+1
- END IF
- NAME = CONNECTIONS(I)(SCAN(CONNECTIONS(I),"-")+1:LEN_TRIM(CONNECTIONS(I)))
- IF((.NOT.ANY(CAVENAMES.EQ.NAME)).AND.(TRIM(NAME).NE."end")) THEN
- CAVENAMES(M) = NAME
- M=M+1
- END IF
- END DO
- CAVENAMES(M)="end"
- DO I=1,N
- A = CONNECTIONS(I)(1:SCAN(CONNECTIONS(I),"-")-1)
- B = CONNECTIONS(I)(SCAN(CONNECTIONS(I),"-")+1:LEN_TRIM(CONNECTIONS(I)))
- J=MAXLOC(CAVENAMES,MASK=CAVENAMES.EQ.A,DIM=1)
- K=MAXLOC(CAVENAMES,MASK=CAVENAMES.EQ.B,DIM=1)
- CONN(MINLOC(CONN(:,J)),J) = K
- CONN(MINLOC(CONN(:,K)),K) = J
- END DO
- VISITED = .FALSE.
- WRITE(*,'(A,I0)') "Part 1: ", NPATHS(CONN,VISITED,1,M,1,.FALSE.)
- WRITE(*,'(A,I0)') "Part 2: ", NPATHS(CONN,VISITED,1,M,2,.FALSE.)
- CONTAINS
- RECURSIVE FUNCTION NPATHS(CONN,V,A,END,PART,DOUBLE) RESULT(P1)
- INTEGER :: CONN(:,:),I,J,A,END,P1,PART
- LOGICAL :: V(:),VISITED(SIZE(VISITED)),DOUBLE
- VISITED = V
- VISITED(A)=.TRUE.
- P1=0
- DO I=1,SIZE(CONN,DIM=1)
- IF(CONN(I,A).EQ.1)CYCLE
- IF(CONN(I,A).EQ.0)EXIT
- IF(CONN(I,A).EQ.END) THEN
- P1=P1+1
- CYCLE
- ELSE
- J=IACHAR(CAVENAMES(CONN(I,A))(1:1))
- IF(J.GE.97 .AND. J.LE.122) THEN
- IF(VISITED(CONN(I,A))) THEN
- IF(DOUBLE .OR. PART.EQ.1) CYCLE
- P1=P1+NPATHS(CONN,VISITED,CONN(I,A),END,PART,.TRUE.)
- CYCLE
- ENDIF
- END IF
- P1=P1+NPATHS(CONN,VISITED,CONN(I,A),END,PART,DOUBLE)
- END IF
- END DO
- END FUNCTION NPATHS
- END PROGRAM DAY12
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement