RosettaCodeData/Task/Percolation-Site-percolation/FreeBASIC/percolation-site-percolation.basic
2024-07-13 15:19:22 -07:00

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