#42827: C++詳解,我解了兩天才解出來,差點沒崩潰\(>A<)/


010521@mail.pcsh.ntpc.edu.tw (Terry practice c++)

學校 : 新北市立板橋高級中學
編號 : 173875
來源 : [140.120.220.44]
最後登入時間 :
2024-11-21 10:42:07
g596. 2. 動線安排 -- 2021年11月APCS | From: [101.136.42.157] | 發表日期 : 2024-10-06 14:46

過不了的重點:
1.直線如果跟橫線交錯的話->等到要拆除時會不小心拆到另一條線
例:(線 = 1, 樁 = 9, 空 = 0, 邊界 = -1)

-1-1-1-1-1-1
-10900-1
-191(改2)19-1
-10100-1
-10900-1
-1-1-1-1-1-1

所以交錯的地方需要用累加的(改成1+1),這樣拆除的時候就不會拆到另外一條

2.如果要建造木樁處已經有線,則需要「先」拆除經過此處的線,「再」建造木樁
這個沒有想到的話真的很難處理,因為你無法得知線的走向(有可能同時兩段線平行且相鄰,這時候沒辦法得知究竟要消除哪裡)
也就是除了add()和remove()外需要再多一個remove_line()
例:(re = remove)

-1    -1
   9   
  919  
       
 911(re)19 
       
-1     -1

然後我就想到,如果遇到「如果要建造木樁處已經有線」這種狀況
那不如先把要建造處的線變成木樁,接著remove(),然後再add(),就順利解決這兩個問題了^__^

完整程式碼:https://github.com/gpsftuEbsl/zerojudge-cpp-program-answers/blob/aa9d8ee9d82724a6da05fb8c945f97b9fcb8833d/g596.cpp
裡面還有一些小技巧

 
#42828: Re: C++詳解,我解了兩天才解出來,差點沒崩潰\(>A<)/


010521@mail.pcsh.ntpc.edu.tw (Terry practice c++)

學校 : 新北市立板橋高級中學
編號 : 173875
來源 : [140.120.220.44]
最後登入時間 :
2024-11-21 10:42:07
g596. 2. 動線安排 -- 2021年11月APCS | From: [101.136.42.157] | 發表日期 : 2024-10-06 14:51

過不了的重點:
1.直線如果跟橫線交錯的話->等到要拆除時會不小心拆到另一條線
例:(線 = 1, 樁 = 9, 空 = 0, 邊界 = -1)

-1-1-1-1-1-1
-10900-1
-191(改2)19-1
-10100-1
-10900-1
-1-1-1-1-1-1

所以交錯的地方需要用累加的(改成1+1),這樣拆除的時候就不會拆到另外一條

2.如果要建造木樁處已經有線,則需要「先」拆除經過此處的線,「再」建造木樁
這個沒有想到的話真的很難處理,因為你無法得知線的走向(有可能同時兩段線平行且相鄰,這時候沒辦法得知究竟要消除哪裡)
也就是除了add()和remove()外需要再多一個remove_line()
例:(re = remove)

-1    -1
   9   
  919  
       
 911(re)19 
       
-1     -1

然後我就想到,如果遇到「如果要建造木樁處已經有線」這種狀況
那不如先把要建造處的線變成木樁,接著remove(),然後再add(),就順利解決這兩個問題了^__^

完整程式碼:https://github.com/gpsftuEbsl/zerojudge-cpp-program-answers/blob/aa9d8ee9d82724a6da05fb8c945f97b9fcb8833d/g596.cpp
裡面還有一些小技巧


補充1.
for(k = 0; k < 4; k++){
        i = r+(k-1)%2;
        j = c+(k-2)%2;
}
這樣寫可以檢查上下左右

補充2.
我用-1把陣列圍起來,檢查出界的時候比較方便

 
#42829: Re: C++詳解,我解了兩天才解出來,差點沒崩潰\(>A<)/


010521@mail.pcsh.ntpc.edu.tw (Terry practice c++)

學校 : 新北市立板橋高級中學
編號 : 173875
來源 : [140.120.220.44]
最後登入時間 :
2024-11-21 10:42:07
g596. 2. 動線安排 -- 2021年11月APCS | From: [101.136.42.157] | 發表日期 : 2024-10-06 14:54

過不了的重點:
1.直線如果跟橫線交錯的話->等到要拆除時會不小心拆到另一條線
例:(線 = 1, 樁 = 9, 空 = 0, 邊界 = -1)

-1-1-1-1-1-1
-10900-1
-191(改2)19-1
-10100-1
-10900-1
-1-1-1-1-1-1

所以交錯的地方需要用累加的(改成1+1),這樣拆除的時候就不會拆到另外一條

2.如果要建造木樁處已經有線,則需要「先」拆除經過此處的線,「再」建造木樁
這個沒有想到的話真的很難處理,因為你無法得知線的走向(有可能同時兩段線平行且相鄰,這時候沒辦法得知究竟要消除哪裡)
也就是除了add()和remove()外需要再多一個remove_line()
例:(re = remove)

-1    -1
   9   
  919  
       
 911(re)19 
       
-1     -1

然後我就想到,如果遇到「如果要建造木樁處已經有線」這種狀況
那不如先把要建造處的線變成木樁,接著remove(),然後再add(),就順利解決這兩個問題了^__^

完整程式碼:https://github.com/gpsftuEbsl/zerojudge-cpp-program-answers/blob/aa9d8ee9d82724a6da05fb8c945f97b9fcb8833d/g596.cpp
裡面還有一些小技巧


補充1.
for(k = 0; k < 4; k++){
        i = r+(k-1)%2;
        j = c+(k-2)%2;
}
這樣寫可以檢查上下左右

補充2.
我用-1把陣列圍起來,檢查出界的時候比較方便


感謝其他解題報告!!!
建議搭配服用

 
ZeroJudge Forum