47 lines
1.1 KiB
Text
47 lines
1.1 KiB
Text
string grid
|
|
integer m, n, last, lastrow
|
|
|
|
enum SOLID = '#', EMPTY=' ', WET = 'v'
|
|
|
|
procedure make_grid(integer x, y, atom p)
|
|
m = x
|
|
n = y
|
|
grid = repeat('\n',x*(y+1)+1)
|
|
last = length(grid)
|
|
lastrow = last-n
|
|
for i=0 to x-1 do
|
|
for j=1 to y do
|
|
grid[1+i*(y+1)+j] = iff(rnd()<p?EMPTY:SOLID)
|
|
end for
|
|
end for
|
|
end procedure
|
|
|
|
function ff(integer i) -- flood_fill
|
|
if i<=0 or i>=last or grid[i]!=EMPTY then return 0 end if
|
|
grid[i] = WET
|
|
return i>=lastrow or ff(i+m+1) or ff(i+1) or ff(i-1) or ff(i-m-1)
|
|
end function
|
|
|
|
function percolate()
|
|
for i=2 to m+1 do
|
|
if ff(i) then return true end if
|
|
end for
|
|
return false
|
|
end function
|
|
|
|
procedure main()
|
|
make_grid(15,15,0.55)
|
|
{} = percolate()
|
|
printf(1,"%dx%d grid:%s",{15,15,grid})
|
|
puts(1,"\nrunning 10,000 tests for each case:\n")
|
|
for ip=0 to 10 do
|
|
atom p = ip/10
|
|
integer count = 0
|
|
for i=1 to 10000 do
|
|
make_grid(15, 15, p)
|
|
count += percolate()
|
|
end for
|
|
printf(1,"p=%.1f: %6.4f\n", {p, count/10000})
|
|
end for
|
|
end procedure
|
|
main()
|