tags: 高中生解題系統

f790. 勝利的五子棋

這題還蠻有趣的,可以玩玩看呦 :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

f790: 勝利的五子棋
Thu, Jul 29, 2021 10:44 PM

Select a repo