尤拉計劃701:隨機連線區域
考慮一個由正方形單元格組成的W × H矩形,每個單元格的面積為1。 每個單元格以概率為0.5獨立地塗成黑色,否則為白色。 假設共享一個邊緣的黑色單元已連線。 考慮連線單元的最大面積。 定義E(W,H)為該最大面積的期望值。 例如, E(2,2) = 1.875,如下圖所示。
已知E(4,4) = 5.76487732,四捨五入到小數點後8位。
求E(7,7),四捨五入到小數點後8位。
畫圖程式:
n=3
m=2
def e(n,m):
g=2**(n*m)
ch='□■'
for i in range(0,g):
print("area",i)
s=bin(i+g)[3:]
x=0
for j in s:
x+=1
print(ch[int(j)],end='')
if x==n:print('');x=0
使用並查集實現的演算法,算4x4要5秒
class UnionFind(object):
"""並查集類"""
def __init__(self, n):
"""長度為n的並查集"""
self.uf = [-1 for i in range(n + 1)] # 列表0位置空出
self.area = [1 for i in range(n + 1)] #某個根的集合面積 列表0位置空出
self.sets_count = n # 判斷並查集裡共有幾個集合, 初始化預設互相獨立
self.s=[]
def find2(self, p):
"""查詢p的根結點(祖先)"""
r = p
while self.uf[p] > 0:
p = self.uf[p]
while r != p:
self.uf[r], r = p, self.uf[r]
return p
def find(self, p):
"""尾遞迴"""
if self.uf[p] < 0:
return p
self.uf[p] = self.find(self.uf[p])
return self.uf[p]
def union(self, p, q):
"""連通p,q 讓q指向p"""
proot = self.find(p)
qroot = self.find(q)
if proot == qroot:
return
elif self.uf[proot] > self.uf[qroot]: # 負數比較, 左邊規模更小
self.area[qroot]+=self.area[proot]
self.uf[qroot] += self.uf[proot]
self.uf[proot] = qroot
else:
self.uf[proot] += self.uf[qroot] # 規模相加
self.area[proot]+=self.area[qroot]
self.uf[qroot] = proot
self.sets_count -= 1 # 連通後集合總數減一
def is_connected(self, p, q):
"""判斷pq是否已經連通"""
return self.find(p) == self.find(q) # 即判斷兩個結點是否是屬於同一個祖先
def setcolor(w,h):
totalarea=0
g=2**(w*h)
ch='□■'
color=[0]*(w*h+1)
for i in range(0,g): #遍歷每種圖案
b=bin(i+g)[3:]
x=0
x1=0
for j in b:
x+=1
x1+=1
color[x]=j #按二進位制數填充當前顏色
#print(ch[int(j)],end='')
#if x1==w:print('');x1=0
uf=UnionFind(w*h) #並查集物件
#uf.js(w,h)
#print(i,uf.s)
for j in range(1,w*h+1):
#把每格分配到集合,然後取area最大的值
#if color[j]=='1':uf.add(j,color)
if color[j]=='1' and (j-1)%w>0 and j-1>0 and not uf.is_connected(j,j-1) and color[j]==color[j-1]: uf.union( j,j-1)
if color[j]=='1' and j-w>0 and not uf.is_connected(j,j-w) and color[j]==color[j-w]: uf.union( j,j-w) #顏色相同的相鄰格加入同一個集合
#print(i,"==>",color, end=' ')
maxarea=0
for j in range(1,w*h+1):
if color[j]=='1' and uf.area[j]>maxarea: maxarea=uf.area[j]
totalarea+=maxarea
#print(i,"==>",maxarea,uf.area,uf.uf,'\n')
return totalarea/g
w,h=4,4
import time
tm=time.time()
print(setcolor(w,h),time.time()-tm)
5.7648773193359375 4.237565040588379
相關文章
- 尤拉計劃695:隨機長方形隨機
- 尤拉計劃697:隨機衰減序列隨機
- 尤拉計劃595題:增量隨機排序隨機排序
- 尤拉計劃425題:質數連線
- 隨機生成指定面積單連通區域隨機
- win10連線區域網印表機的步驟_win10如何連線區域網印表機Win10
- HHDESK區域網連線功能
- 虛擬機器怎麼連線到區域網虛擬機
- 000. 尤拉計劃簡介
- 尤拉計劃512題(冪的尤拉總計函式和)函式
- 尤拉計劃717:取模公式之和公式
- 計算機區域網計算機
- 配置SQL server遠端連線(區域網)SQLServer
- 尤拉計劃713:圖蘭熱水系統
- JVM區域劃分JVM
- 尤拉計劃711:二進位制黑板
- 尤拉計劃605題:結對投幣遊戲遊戲
- Java虛擬機器記憶體區域劃分Java虛擬機記憶體
- 兩臺筆記本怎麼連線區域網筆記
- Windows10系統無法連線區域網印表機的解決方法Windows
- 尤拉計劃463題:奇怪的遞迴關係遞迴
- 用尤拉計劃題目來學q語法
- 基於人形檢測的劃區域客流統計
- 尤拉計劃533題:卡邁克爾函式函式
- 【計算機網路】資料鏈路層——無線區域網與VLAN計算機網路
- Java虛擬機器執行時資料區域劃分Java虛擬機
- 二次開發連線區域網其它資料庫資料庫
- JVM記憶體區域劃分JVM記憶體
- jvm 記憶體區域劃分JVM記憶體
- Sqlserver執行計劃中表的四種連線方式SQLServer
- 元件無線區域網元件
- 手機上WAP和NET連線的區別
- 區分socket連線和tcp/ip連線TCP
- 等值連線和自然連線的區別
- Odoo 連線ldap 域認證OdooLDA
- javascript 隨機數區間JavaScript隨機
- 外網連線內部區域網的方法--ip 埠對映
- 遠端桌面此計算機無法連線到遠端計算機請嘗試重新連線。計算機