program perkolation
implicit none
integer, parameter :: m = 10, n = 10
integer a(0:m+1, 0:n+1)
integer k,f,g,i,j,x,y,yy
real l,c
common a
g=0
a=0
do while(g<50)
call random_number(l)
call random_number(c)
k=10*l
f=10*c
if (a(k,f)==0) then! Создаю сетку 10*10 и заполняю 50% "1"
a(k,f)=1
g=g+1
endif
enddo
do j=1,n
a(0,j)=0! Накладываю граничные условия в виде "0" слева
enddo
do j=1,n
a(m+1,j)=0! Накладываю граничные условия в виде "0" справа
enddo
do i=1,m
a(i,0)=0! Накладываю граничные условия в виде "0" вверху
enddo
do i=1,m
a(i,n+1)=0! Накладываю граничные условия в виде "0" внизу
enddo
do yy=1,n!Перебор элементов по оси y сверху вниз для того, чтобы искать другой путь, если тупик
x=1
y=yy
if (a(x,y+1)==1) then! Ищу, куда сделать первый шаг
y=y+1
Call up(x,y)
endif
if (a(x+1,y)==1) then
x=x+1
Call forward(x,y)
endif
if (a(x,y-1)==1) then
y=y-1
Call down(x,y)
endif
if (a(x-1,y)==1) then
x=x-1
Call ago(x,y)
endif
enddo
end program perkolation
subroutine up(x1,y1)! Подпрограмма шага вверх
implicit none
integer, parameter :: m = 10, n = 10
integer a(0:m+1, 0:n+1)
integer x1,y1
common a
if (a(x1-1,y1)==1) then
x1=x1-1
Call ago(x1,y1)
endif
if (a(x1,y1+1)==1) then
y1=y1+1
Call up(x1,y1)
endif
if (a(x1+1,y1)==1) then
x1=x1+1
Call forward(x1,y1)
endif
if (a(x1,y1-1)==1) then
y1=y1-1
Call down(x1,y1)
endif
end subroutine up
subroutine forward(x2,y2)! Подпрограмма шага вперед
implicit none
integer, parameter :: m = 10, n = 10
integer a(0:m+1, 0:n+1)
integer x2,y2
common a
if (a(x2,y2+1)==1) then
y2=y2+1
Call up(x2,y2)
endif
if (a(x2+1,y2)==1) then
x2=x2+1
Call forward(x2,y2)
endif
if (a(x2,y2-1)==1) then
y2=y2-1
Call down(x2,y2)
endif
if (a(x2-1,y2)==1) then
x2=x2-1
Call ago(x2,y2)
endif
end subroutine forward
subroutine down(x3,y3)! Подпрограмма шага вниз
implicit none
integer, parameter :: m = 10, n = 10
integer a(0:m+1, 0:n+1)
integer x3,y3
common a
if (a(x3+1,y3)==1) then
x3=x3+1
Call forward(x3,y3)
endif
if (a(x3,y3-1)==1) then
y3=y3-1
Call down(x3,y3)
endif
if (a(x3-1,y3)==1) then
x3=x3-1
Call ago(x3,y3)
endif
if (a(x3,y3+1)==1) then
y3=y3+1
Call up(x3,y3)
endif
end subroutine down
subroutine ago(x4,y4)! Подпрограмма шага назад
implicit none
integer, parameter :: m = 10, n = 10
integer a(0:m+1, 0:n+1)
integer x4,y4
common a
if (a(x4,y4-1)==1) then
y4=y4-1
Call down(x4,y4)
endif
if (a(x4-1,y4)==1) then
x4=x4-1
Call ago(x4,y4)
endif
if (a(x4,y4+1)==1) then
y4=y4+1
Call up(x4,y4)
endif
if (a(x4+1,y4)==1) then
x4=x4+1
Call forward(x4,y4)
endif
end subroutine ago