55 lines
1.2 KiB
Text
55 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 makeGrid(x As Integer, y As Integer, p As Double)
|
|
Dim As Integer i, j
|
|
|
|
m = x
|
|
n = y
|
|
grid = String(x*(y+1)+1, Chr(10))
|
|
last = Len(grid)
|
|
lastrow = last - n
|
|
For i = 0 To x-1
|
|
For j = 1 To y
|
|
Mid(grid, 1+i*(y+1)+j, 1) = Iif(Rnd < p, EMPTY, SOLID)
|
|
Next j
|
|
Next i
|
|
End Sub
|
|
|
|
Function ff(i As Integer) As Integer
|
|
If i <= 0 Or i >= last Or Mid(grid, i, 1) <> EMPTY Then Return 0
|
|
Mid(grid, i, 1) = 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
|
|
|
|
Randomize Timer
|
|
makeGrid(15, 15, 0.55)
|
|
percolate()
|
|
Print "15x15 grid:";
|
|
Print grid
|
|
|
|
Print "running 10,000 tests for each case:"
|
|
Dim As Double p
|
|
Dim As Integer ip, i, cnt
|
|
For ip = 0 To 10
|
|
p = ip / 10
|
|
cnt = 0
|
|
For i = 1 To 10000
|
|
makeGrid(15, 15, p)
|
|
cnt += (percolate() = 1)
|
|
Next i
|
|
Print Using "p=#.#: #.####"; p; Abs(cnt / 10000)
|
|
Next ip
|
|
|
|
Sleep
|