#26273: [Python]解題思路


406490150@gms.tku.edu.tw (我是朱朱)

學校 : 國立交通大學
編號 : 139794
來源 : [140.113.236.122]
最後登入時間 :
2022-09-03 11:13:16
f790. 勝利的五子棋 -- DD的奇幻冒險之旅 | From: [218.173.234.41] | 發表日期 : 2021-07-29 22:30

這題還蠻有趣的,可以玩玩看呦 :D

  1. 產生要比對的lines(橫行、直行、左上-右下斜線、右上-左下斜線)
    其實line沒有分方向性,由左至右 或 由右至左都可以

    1. 橫行,也就是原本的input

    2. 直行,也就是transpose後的橫行,可以用zip(*)

    3. 左上-右下斜線(大致可分為三種可能)

      1. index(x,y) = [(0,0), (1,1)... (6,6)]單純的斜線

      2. 從(0,0)往右偏移1,或偏移2, 例如:[(0,1),(1,2)...,(5,6)]

      3. 從(0,0)往下偏移1,或偏移2, 例如:[(1,0),(2,1)...,(6,5)]

      • 為什麼只需要上述這五條(1+2+2)呢?

        我個人認為只有以下這幾種可能,因此一行最少需要5個子才符合

        • 活3+空2 = 5(活三)

        • 活3+空3 = 6(活三)

        • 活4+空2 = 6(活四)

        • 死4+空1 = 5(死四)

    4. 右上-左下斜線

      • 我的作法是把原本的棋盤,左右翻轉(row[::-1]),

        再套用上述[1.3.左上-右下]的方法就可以又產生五行了

  2. 驗證每一行line,並計算出現個數

    1. 創一個list用來當作counter存[死四, 活四, 活三]的出現次數

    2. 把死四、活四、活三的組合列出來(例如設一個list叫patterns)

      • 如何驗證死四會撞牆(例如'xoooo')?我的做法是多填一個空白當作牆壁(例如'xoooo '、' oooox')
        如果用這個方法,原本的line取出來之後要在旁邊也多加牆壁(例如' ' + line +' ')

      • [死四, 活四, 活三] 各有 [兩種、一種、三種]可能,

    3. 把[最一開始(1.)產生的lines]一行行與[上述的死四、活四、活三組合]做比較

      (一行行就是跑for迴圈,例如for line in lines: for patten in pattens:)
      (if pattern in line: cnt[idx] += 1)

  3. 列印出現個數

    • 沒什麼難的,查表即可("玲醫雙參肆伍陸柒捌玖拾",錯別字"零一"用不到)

 

大概是這樣,給你參考看看 :D

 

 
#26274: Re:[Python]解題思路


406490150@gms.tku.edu.tw (我是朱朱)

學校 : 國立交通大學
編號 : 139794
來源 : [140.113.236.122]
最後登入時間 :
2022-09-03 11:13:16
f790. 勝利的五子棋 -- DD的奇幻冒險之旅 | From: [218.173.234.41] | 發表日期 : 2021-07-29 22:43

這題還蠻有趣的,可以玩玩看呦 :D

  1. 產生要比對的lines(橫行、直行、左上-右下斜線、右上-左下斜線)
    其實line沒有分方向性,由左至右 或 由右至左都可以
    1. 橫行,也就是原本的input
    2. 直行,也就是transpose後的橫行,可以用zip(*)
    3. 左上-右下斜線(大致可分為三種可能)
      1. index(x,y) = [(0,0), (1,1)… (6,6)]單純的斜線
      2. 從(0,0)往右偏移1,或偏移2, 例如:[(0,1),(1,2)…,(5,6)]
      3. 從(0,0)往下偏移1,或偏移2, 例如:[(1,0),(2,1)…,(6,5)]
        • 為什麼只需要上述這五條(1+2+2)呢?
          我個人認為只有以下這幾種可能,因此一行最少需要5個子才符合
          • 活3+空2 = 5(活三)
          • 活3+空3 = 6(活三)
          • 活4+空2 = 6(活四)
          • 死4+空1 = 5(死四)
      4. 右上-左下斜線
        • 我的作法是把原本的棋盤,左右翻轉(row[::-1]),
          再套用上述[1.3.左上-右下]的方法就可以又產生五行了
  2. 驗證每一行line,並計算出現個數
    1. 創一個list用來當作counter存[死四, 活四, 活三]的出現次數
    2. 把死四、活四、活三的組合列出來(例如設一個list叫patterns)
      • 如何驗證死四會撞牆(例如’xoooo’)?
        我的做法是多填一個空白當作牆壁(例如’xoooo ‘、’ oooox’)
        如果用這個方法,原本的line取出來之後要在旁邊也多加牆壁(例如’ ’ + line +’ ')

      • [死四, 活四, 活三] 各有 [兩種、一種、三種]可能

    3. 把[最一開始(1.)產生的lines]一行行與[上述的死四、活四、活三組合]做比較
      (一行行就是跑for迴圈,例如for line in lines: for patten in pattens:)
      (if pattern in line: cnt[idx] += 1)
  3. 列印出現個數
    • 沒什麼難的,查表即可(“玲醫雙參肆伍陸柒捌玖拾”,錯別字"零一"用不到)

大概是這樣,給你參考看看 :D

 
 
ZeroJudge Forum