56 lines
1.2 KiB
Text
56 lines
1.2 KiB
Text
#define SOLID "#"
|
|
#define EMPTY " "
|
|
#define WET "v"
|
|
|
|
Dim Shared As String grid()
|
|
Dim Shared As Integer last, lastrow, m, n
|
|
|
|
Sub make_grid(x As Integer, y As Integer, p As Double)
|
|
m = x
|
|
n = y
|
|
Redim Preserve grid(x*(y+1)+1)
|
|
last = Len(grid)
|
|
Dim As Integer lastrow = last-n
|
|
Dim As Integer i, j
|
|
|
|
For i = 0 To x-1
|
|
For j = 1 To y
|
|
grid(1+i*(y+1)+j) = Iif(Rnd < p, EMPTY, SOLID)
|
|
Next j
|
|
Next i
|
|
End Sub
|
|
|
|
Function ff(i As Integer) As Boolean
|
|
If i <= 0 Or i >= last Or grid(i) <> EMPTY Then Return 0
|
|
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() As Integer
|
|
For i As Integer = 2 To m+1
|
|
If ff(i) Then Return 1
|
|
Next i
|
|
Return 0
|
|
End Function
|
|
|
|
Dim As Double p
|
|
Dim As Integer ip, i, cont
|
|
|
|
make_grid(15, 15, 0.55)
|
|
Print "15x15 grid:"
|
|
For i = 1 To Ubound(grid)
|
|
Print grid(i);
|
|
If i Mod 15 = 0 Then Print
|
|
Next i
|
|
|
|
Print !"\nrunning 10,000 tests for each case:"
|
|
For ip As Ubyte = 0 To 10
|
|
p = ip / 10
|
|
cont = 0
|
|
For i = 1 To 10000
|
|
make_grid(15, 15, p)
|
|
cont += percolate()
|
|
Next i
|
|
Print Using "p=#.#: #.####"; p; cont/10000
|
|
Next ip
|
|
Sleep
|