def plus(s,w,m,n,j):u=0U=0D=0d=0L=0l=0R=0r=0com=[]for i in range(1,w[j][0]+1):u+=1U+=1if s[w[j][0]-i][w[j][1]]==0.5 or s[w[j][0]-i][w[j][1]]==1.5:U-=1continueif s[w[j][0]-i][w[j][1]]==-1 and U!=1 and U!=0:com.append([u,'U',U])breakif s[w[j][0]-i][w[j][1]]==-1 and U==1 or U==0:breakfor k in range(1,m-w[j][0]):d+=1D+=1if s[w[j][0]+k][w[j][1]]==0.5 or s[w[j][0]+k][w[j][1]]==1.5:D-=1continueif s[w[j][0]+k][w[j][1]]==-1 and D!=1 and D!=0:com.append([d,'D',D])breakif s[w[j][0]+k][w[j][1]]==-1 and D==1 or D==0:breakfor Q in range(1,w[j][1]+1):l+=1L+=1if s[w[j][0]][w[j][1]-Q]==1 or s[w[j][0]][w[j][1]-Q]==1.5:L-=1continueif s[w[j][0]][w[j][1]-Q]==-1 and L!=1 and L!=0:com.append([l,'L',L])breakif s[w[j][0]][w[j][1]-Q]==-1 and L==1 or L==0:breakfor H in range(1,n-w[j][1]):r+=1R+=1if s[w[j][0]][w[j][1]+H]==1 or s[w[j][0]][w[j][1]+H]==1.5:R-=1continueif s[w[j][0]][w[j][1]+H]==-1 and R!=1 and R!=0:com.append([r,'R',R])breakif s[w[j][0]][w[j][1]+H]==-1 and R==1 or R==0:breakif len(com)==0:return s
com.sort()va=1for C in range(1,len(com)):if com[va][0]!=com[0][0]:com.pop(1)else:va+=1#print(com)for B in com:if B[1]=='U':for F in range(1,u):if s[w[j][0]-F][w[j][1]]==0.5 or s[w[j][0]-F][w[j][1]]==1.5:continues[w[j][0]-F][w[j][1]]+=0.5elif B[1]=='D':for E in range(1,d):if s[w[j][0]+E][w[j][1]]==0.5 or s[w[j][0]+E][w[j][1]]==1.5:continues[w[j][0]+E][w[j][1]]+=0.5elif B[1]=='L':for C in range(1,l):if s[w[j][0]][w[j][1]-C]==1 or s[w[j][0]][w[j][1]-C]==1.5:continues[w[j][0]][w[j][1]-C]+=1else:for K in range(1,r):if s[w[j][0]][w[j][1]+K]==1 or s[w[j][0]][w[j][1]+K]==1.5:continues[w[j][0]][w[j][1]+K]+=1#print(s)return s
def reduce(s,w,m,n,j):goya=1try:while 1:if s[w[j][0]-goya][w[j][1]]==-1 or s[w[j][0]-goya][w[j][1]]==0:breakelif s[w[j][0]-goya][w[j][1]]==0.5 or s[w[j][0]-goya][w[j][1]]==1.5:s[w[j][0]-goya][w[j][1]]-=0.5goya+=1except:passgoya=1try:while 1:if s[w[j][0]+goya][w[j][1]]==-1 or s[w[j][0]+goya][w[j][1]]==0:breakelif s[w[j][0]+goya][w[j][1]]==0.5 or s[w[j][0]+goya][w[j][1]]==1.5:s[w[j][0]+goya][w[j][1]]-=0.5goya+=1except:passgoya=1try:while 1:if s[w[j][0]][w[j][1]-goya]==-1 or s[w[j][0]][w[j][1]-goya]==0 or w[j][1]-goya==-1:breakelif s[w[j][0]][w[j][1]-goya]==1 or s[w[j][0]][w[j][1]-goya]==1.5:s[w[j][0]][w[j][1]-goya]-=1goya+=1except:passgoya=1try:while 1:if s[w[j][0]][w[j][1]+goya]==-1 or s[w[j][0]][w[j][1]+goya]==0:breakelif s[w[j][0]][w[j][1]+goya]==1 or s[w[j][0]][w[j][1]+goya]==1.5:s[w[j][0]][w[j][1]+goya]-=1goya+=1except:passreturn sm,n,h=map(int,input().split())w=[]for i in range(h):w.append(list(map(int,input().split())))##m,n,h=3,4,4##w=[[0,1,0],[2,1,0],[2,3,0],[2,1,1]]s=[]Acount=[]for p in range(m):sex=[]for jam in range(n):sex.append(0)s.append(sex)for j in range(h):count=0if w[j][2]==0:s[w[j][0]][w[j][1]]=-1#print(s)plus(s,w,m,n,j)elif w[j][2]==1:s[w[j][0]][w[j][1]]=0reduce(s,w,m,n,j)for har in s:all=nfor harvey in har:if harvey==0 or harvey==0.0:all-=1count+=all#print(s)Acount.append(count)#print(s)
print(max(Acount))print(Acount[-1])
說明:這題我寫了增加與減少兩個函數,有考慮到一格有同時存在垂直與水平的線,也有考慮到一次增加多住柱子的可能
增加:往四個方向找最近的柱子,並記錄走的格數,若是連接垂直的柱子就在那格加0.5,水平則加1
減少:一樣是往四個方向找最近的柱子,並記錄走的格數,若是連接垂直的柱子就在那格減0.5,水平則減1
我建議你把程式碼貼在公開平台的 IDE ,並且把每一段程式碼內容加上註解,分享給其他人看時也比較清楚。
這個題目牽涉到4個方向移動加上{ 移除和加入 },會形成8種狀況寫法各自處理,導致內容很冗長,修改上也容易複製貼上時搞混不容易 debug。
你最好把這個行為包裝成函數,透過傳入參數(dx,dy)做位移時會清楚很多,這種概念在寫二維陣列的方向移動時很常見。
寫法上你想用值代表這格子有橫線 / 直線 / 空格 / 柱子/ 十字線的狀態,用值代表狀態的狀態壓縮寫法不太容易 debug ,建議你拆成3個陣列處理
類似概念的題單我放在這份 投影片 的第 15 頁你可以自己自主練習。
我建議你把程式碼貼在公開平台的 IDE ,並且把每一段程式碼內容加上註解,分享給其他人看時也比較清楚。
這個題目牽涉到4個方向移動加上{ 移除和加入 },會形成8種狀況寫法各自處理,導致內容很冗長,修改上也容易複製貼上時搞混不容易 debug。
你最好把這個行為包裝成函數,透過傳入參數(dx,dy)做位移時會清楚很多,這種概念在寫二維陣列的方向移動時很常見。
寫法上你想用值代表這格子有橫線 / 直線 / 空格 / 柱子/ 十字線的狀態,用值代表狀態的狀態壓縮寫法不太容易 debug ,建議你拆成3個陣列處理
類似概念的題單我放在這份 投影片 的第 15 頁你可以自己自主練習。
好的,我再試試看好了,謝謝解答!