#33080: 求助..已經寫了好幾天了,測資都是對的,但一直卡在35%。有沒有好心人能幫我看一下哪裡出錯了


Moofon0222 (unknown)

學校 : 國立臺北科技大學
編號 : 205817
來源 : [101.139.114.84]
最後登入時間 :
2023-05-30 00:51:53
g596. 2. 動線安排 -- 2021年11月APCS | From: [101.137.185.40] | 發表日期 : 2022-11-28 21:49

def plus(s,w,m,n,j):
    u=0
    U=0
    D=0
    d=0
    L=0
    l=0
    R=0
    r=0
    com=[]
    for i in range(1,w[j][0]+1):
        u+=1
        U+=1
        if s[w[j][0]-i][w[j][1]]==0.5 or s[w[j][0]-i][w[j][1]]==1.5:
            U-=1
            continue
        if s[w[j][0]-i][w[j][1]]==-1 and U!=1 and U!=0:
            com.append([u,'U',U])
            break
        if s[w[j][0]-i][w[j][1]]==-1 and U==1 or U==0:
            break
    for k in range(1,m-w[j][0]):
        d+=1
        D+=1
        if s[w[j][0]+k][w[j][1]]==0.5 or s[w[j][0]+k][w[j][1]]==1.5:
            D-=1
            continue
        if s[w[j][0]+k][w[j][1]]==-1 and D!=1 and D!=0:
            com.append([d,'D',D])
            break
        if s[w[j][0]+k][w[j][1]]==-1 and D==1 or D==0:
            break
    for Q in range(1,w[j][1]+1):
        l+=1
        L+=1
        if s[w[j][0]][w[j][1]-Q]==1 or s[w[j][0]][w[j][1]-Q]==1.5:
            L-=1
            continue
        if s[w[j][0]][w[j][1]-Q]==-1 and L!=1 and L!=0:
            com.append([l,'L',L])
            break
        if s[w[j][0]][w[j][1]-Q]==-1 and L==1 or L==0:
            break
    for H in range(1,n-w[j][1]):
        r+=1
        R+=1
        if s[w[j][0]][w[j][1]+H]==1 or s[w[j][0]][w[j][1]+H]==1.5:
            R-=1
            continue
        if s[w[j][0]][w[j][1]+H]==-1 and R!=1 and R!=0:
            com.append([r,'R',R])
            break
        if s[w[j][0]][w[j][1]+H]==-1 and R==1 or R==0:
            break
    if len(com)==0:
        return s

    com.sort()
    va=1
    for 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:
                     continue
                 s[w[j][0]-F][w[j][1]]+=0.5
         elif 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:
                     continue
                 s[w[j][0]+E][w[j][1]]+=0.5
         elif 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:
                     continue
                 s[w[j][0]][w[j][1]-C]+=1
         else:
             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:
                     continue
                 s[w[j][0]][w[j][1]+K]+=1
    #print(s)
    return s

def reduce(s,w,m,n,j):
    goya=1
    try:
        while 1:
            if s[w[j][0]-goya][w[j][1]]==-1 or s[w[j][0]-goya][w[j][1]]==0:
                break
            elif 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.5
            goya+=1
    except:
        pass
    goya=1
    try:
        while 1:
            if s[w[j][0]+goya][w[j][1]]==-1 or s[w[j][0]+goya][w[j][1]]==0:
                break
            elif 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.5
            goya+=1
    except:
        pass
    goya=1
    try:
        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:
                break
            elif 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]-=1
            goya+=1
    except:
        pass
    goya=1
    try:
        while 1:
            if s[w[j][0]][w[j][1]+goya]==-1 or s[w[j][0]][w[j][1]+goya]==0:
                break
            elif 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]-=1
            goya+=1
    except:
        pass
    return s
m,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=0
    if 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]]=0
        reduce(s,w,m,n,j)
    for har in s:
        all=n
        for harvey in har:
            if harvey==0 or harvey==0.0:
                all-=1
        count+=all
    #print(s)        
    Acount.append(count)
   
#print(s)    

print(max(Acount))
print(Acount[-1])
 
#33081: Re: 求助..已經寫了好幾天了,測資都是對的,但一直卡在35%。有沒有好心人能幫我看一下哪裡出錯了


Moofon0222 (unknown)

學校 : 國立臺北科技大學
編號 : 205817
來源 : [101.139.114.84]
最後登入時間 :
2023-05-30 00:51:53
g596. 2. 動線安排 -- 2021年11月APCS | From: [101.137.185.40] | 發表日期 : 2022-11-28 21:55

def plus(s,w,m,n,j):
    u=0
    U=0
    D=0
    d=0
    L=0
    l=0
    R=0
    r=0
    com=[]
    for i in range(1,w[j][0]+1):
        u+=1
        U+=1
        if s[w[j][0]-i][w[j][1]]==0.5 or s[w[j][0]-i][w[j][1]]==1.5:
            U-=1
            continue
        if s[w[j][0]-i][w[j][1]]==-1 and U!=1 and U!=0:
            com.append([u,'U',U])
            break
        if s[w[j][0]-i][w[j][1]]==-1 and U==1 or U==0:
            break
    for k in range(1,m-w[j][0]):
        d+=1
        D+=1
        if s[w[j][0]+k][w[j][1]]==0.5 or s[w[j][0]+k][w[j][1]]==1.5:
            D-=1
            continue
        if s[w[j][0]+k][w[j][1]]==-1 and D!=1 and D!=0:
            com.append([d,'D',D])
            break
        if s[w[j][0]+k][w[j][1]]==-1 and D==1 or D==0:
            break
    for Q in range(1,w[j][1]+1):
        l+=1
        L+=1
        if s[w[j][0]][w[j][1]-Q]==1 or s[w[j][0]][w[j][1]-Q]==1.5:
            L-=1
            continue
        if s[w[j][0]][w[j][1]-Q]==-1 and L!=1 and L!=0:
            com.append([l,'L',L])
            break
        if s[w[j][0]][w[j][1]-Q]==-1 and L==1 or L==0:
            break
    for H in range(1,n-w[j][1]):
        r+=1
        R+=1
        if s[w[j][0]][w[j][1]+H]==1 or s[w[j][0]][w[j][1]+H]==1.5:
            R-=1
            continue
        if s[w[j][0]][w[j][1]+H]==-1 and R!=1 and R!=0:
            com.append([r,'R',R])
            break
        if s[w[j][0]][w[j][1]+H]==-1 and R==1 or R==0:
            break
    if len(com)==0:
        return s

    com.sort()
    va=1
    for 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:
                     continue
                 s[w[j][0]-F][w[j][1]]+=0.5
         elif 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:
                     continue
                 s[w[j][0]+E][w[j][1]]+=0.5
         elif 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:
                     continue
                 s[w[j][0]][w[j][1]-C]+=1
         else:
             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:
                     continue
                 s[w[j][0]][w[j][1]+K]+=1
    #print(s)
    return s

def reduce(s,w,m,n,j):
    goya=1
    try:
        while 1:
            if s[w[j][0]-goya][w[j][1]]==-1 or s[w[j][0]-goya][w[j][1]]==0:
                break
            elif 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.5
            goya+=1
    except:
        pass
    goya=1
    try:
        while 1:
            if s[w[j][0]+goya][w[j][1]]==-1 or s[w[j][0]+goya][w[j][1]]==0:
                break
            elif 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.5
            goya+=1
    except:
        pass
    goya=1
    try:
        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:
                break
            elif 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]-=1
            goya+=1
    except:
        pass
    goya=1
    try:
        while 1:
            if s[w[j][0]][w[j][1]+goya]==-1 or s[w[j][0]][w[j][1]+goya]==0:
                break
            elif 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]-=1
            goya+=1
    except:
        pass
    return s
m,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=0
    if 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]]=0
        reduce(s,w,m,n,j)
    for har in s:
        all=n
        for harvey in har:
            if harvey==0 or harvey==0.0:
                all-=1
        count+=all
    #print(s)        
    Acount.append(count)
   
#print(s)    

print(max(Acount))
print(Acount[-1])

說明:這題我寫了增加與減少兩個函數,有考慮到一格有同時存在垂直與水平的線,也有考慮到一次增加多住柱子的可能

增加:往四個方向找最近的柱子,並記錄走的格數,若是連接垂直的柱子就在那格加0.5,水平則加1

減少:一樣是往四個方向找最近的柱子,並記錄走的格數,若是連接垂直的柱子就在那格減0.5,水平則減1

 
#33084: Re: 求助..已經寫了好幾天了,測資都是對的,但一直卡在35%。有沒有好心人能幫我看一下哪裡出錯了


rollfc (胖胖貓)

學校 : 國立清華大學
編號 : 81012
來源 : [49.216.18.187]
最後登入時間 :
2024-11-10 10:25:04
g596. 2. 動線安排 -- 2021年11月APCS | From: [111.249.86.1] | 發表日期 : 2022-11-29 00:18

我建議你把程式碼貼在公開平台的 IDE ,並且把每一段程式碼內容加上註解,分享給其他人看時也比較清楚。

這個題目牽涉到4個方向移動加上{ 移除和加入 },會形成8種狀況寫法各自處理,導致內容很冗長,修改上也容易複製貼上時搞混不容易 debug。

你最好把這個行為包裝成函數,透過傳入參數(dx,dy)做位移時會清楚很多,這種概念在寫二維陣列的方向移動時很常見。

寫法上你想用值代表這格子有橫線 / 直線 / 空格 / 柱子/ 十字線的狀態,用值代表狀態的狀態壓縮寫法不太容易 debug ,建議你拆成3個陣列處理

類似概念的題單我放在這份 投影片 的第 15 頁你可以自己自主練習。

 
#33085: Re: 求助..已經寫了好幾天了,測資都是對的,但一直卡在35%。有沒有好心人能幫我看一下哪裡出錯了


Moofon0222 (unknown)

學校 : 國立臺北科技大學
編號 : 205817
來源 : [101.139.114.84]
最後登入時間 :
2023-05-30 00:51:53
g596. 2. 動線安排 -- 2021年11月APCS | From: [140.124.249.137] | 發表日期 : 2022-11-29 11:18

我建議你把程式碼貼在公開平台的 IDE ,並且把每一段程式碼內容加上註解,分享給其他人看時也比較清楚。

這個題目牽涉到4個方向移動加上{ 移除和加入 },會形成8種狀況寫法各自處理,導致內容很冗長,修改上也容易複製貼上時搞混不容易 debug。

你最好把這個行為包裝成函數,透過傳入參數(dx,dy)做位移時會清楚很多,這種概念在寫二維陣列的方向移動時很常見。

寫法上你想用值代表這格子有橫線 / 直線 / 空格 / 柱子/ 十字線的狀態,用值代表狀態的狀態壓縮寫法不太容易 debug ,建議你拆成3個陣列處理

類似概念的題單我放在這份 投影片 的第 15 頁你可以自己自主練習。

好的,我再試試看好了,謝謝解答!

 
ZeroJudge Forum