problem_21.f90 Source File


This file depends on

sourcefile~~problem_21.f90~~EfferentGraph sourcefile~problem_21.f90 problem_21.f90 sourcefile~aoc_utilities.f90 aoc_utilities.F90 sourcefile~problem_21.f90->sourcefile~aoc_utilities.f90

Source Code

program problem_21

    use aoc_utilities
    use iso_fortran_env

    implicit none

    character(len=1),dimension(:,:),allocatable :: array
    integer :: nrows, ncols, i, j
    integer,dimension(2) :: iloc
    integer,dimension(:,:),allocatable :: icount

    call clk%tic()

    ! array = read_file_to_char_array('inputs/day21_test.txt', border='#')
    array = read_file_to_char_array('inputs/day21.txt', border='.')
    nrows = size(array,1)
    ncols = size(array,2)
    allocate(icount(nrows, ncols)); icount = 0

    iloc = findloc(array, 'S') ! find starting point
    i = iloc(1)
    j = iloc(2)
    array(i,j) = 'O' ! starting here

    do i = 1, 64
        call step(array)
    end do
    write(*,*) '21a: ', count(array == 'O')

    call clk%toc('21')

    contains

    recursive subroutine step(array)
        !! take all valid steps from any # elements in array
        character(len=1),dimension(:,:),intent(inout),allocatable :: array
        integer :: i,j
        logical :: steped
        character(len=1),dimension(:,:),allocatable :: tmp
        tmp = array
        do i = 1, nrows
            do j = 1, ncols
                if (array(i,j)=='O') then
                    steped = .false.
                    ! try a step in each direction:
                    if (array(i-1,j)=='.') then
                        tmp(i-1,j)='O'; steped = .true.
                    end if
                    if (array(i+1,j)=='.') then
                        tmp(i+1,j)='O'; steped = .true.
                    end if
                    if (array(i,j-1)=='.') then
                        tmp(i,j-1)='O'; steped = .true.
                    end if
                    if (array(i,j+1)=='.') then
                        tmp(i,j+1)='O'; steped = .true.
                    end if
                    if (steped) tmp(i,j) = '.'
                end if
            end do
        end do
        call move_alloc(tmp,array)
    end subroutine step

end program problem_21