[ProblemSolving]Back-2615グラビア(実装)


提问链接


問題の説明


五子棋は碁盤の白黒の駒が交互に対戦するゲームである.碁盤には19本の横線と19本の縦線が描かれており、横線は上から下へ1番、2番、・・・19番の番号があります.縦の線は左から右へ1番、2番です.19番を加える.
上の図のように、同じ色の駒が5粒連続で落ちると、その色が勝つ.ここで、連続は、横方向、縦方向または対角線方向を意味する.つまり、上図は黒が勝つ場合です.しかし、6粒以上連続して置くと、勝つわけではありません.
入力で碁盤がどのような状態にあるかを判断すると、黒が勝ったのか、白が勝ったのか、まだ勝負は決まっていない.ただし、黒と白が同時に勝つか、黒または白が同時に2つ以上の位置で勝つと入力は入りません.

入力


19行目では、行ごとに19個の数字で表示され、黒の駒が1個、白の駒が2個、駒を置かない位置は0で表示され、数字はスペースで区切られている.

しゅつりょく


1行目が黒で勝った時は1、白で勝った時は2、まだ勝負が決まっていない時は0.黒または白が勝った場合、2行目の連続する5つの駒のうち最も左の駒(連続する5つの駒が垂直に配置されている場合、その中で最も上の駒)の横線番号と縦線番号が順番に出力されます.

入力例1


0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 2 0 0 2 2 2 1 0 0 0 0 0 0 0 0 0 0
0 0 1 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 2 2 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

サンプル出力1


1
3 2

に答える

구현問題
実は難しい...難しいと思いますが...あまりにも実現できない.

参考解答1


大まかに二つの面を考えなければならない.
1.오목의 방향 탐색:上下左右の対角線は全部で8方向に移動することができて、この時一方向に移動する必要があって、対称を考慮して、4つの方向を選択します.4方向(右上対角線、右下対角線、右下対角線、下)は任意に設定します.
2. 오목인지 6목인지 구분1)凹んだ場合、次のコマが同じ色であるかどうかを同じ方向でチェックする
2)最初のコマの反対方向のコマが同じ色かどうかをチェックする

説明する。


スタートの駒はkに貯まる.
同時にゲートを介して条件を満たす場合を見つけ,cntを更新する.
cntが5個、すなわち凹であれば、1番目の駒の逆方向の駒が同じ色であるか否かを計算し、凹の駒kに戻れないか勝負が分かれない場合は0を返す.
ホームから返された値でなければ勝負が決まるので、逃げて出力します.

コード#コード#

  • プール1コード
  • import sys
    input= sys.stdin.readline
    board = list( list(map(int, input().split())) for _ in range(19))
    
    # 오른 위 대각선, 오른쪽, 오른 아래 대각선, 아래
    dx = [-1, 0, 1, 1]
    dy = [1, 1, 1, 0]
    
    for x in range(19):
        for y in range(19):
            if board[x][y]:
                z= board[x][y]
                for k in range(4):
                    nx = x + dx[k]
                    ny = y + dy[k]
                    cnt = 1
                    # 단방향으로 이동하면서 다음 바둑알의 색이 같다면 카운트 증가
                    while 0<= nx < 19 and 0<= ny < 19 and board[nx][ny] == z:
                        cnt += 1
                        
                        if cnt == 5:
                            # 다음 바둑알의 색을 확인하여 육목인지 판별
                            if 0 <= nx + dx[k] < 19 and 0<= ny + dy[k] < 19 and board[nx + dx[k]][ny + dy[k]] == z:
                                break
                            # x,y(탐색 시작한 위치)의 반대 방향에 같은 색의 바둑알이 있다면 육목
                            if 0 <= x - dx[k] < 19 and 0 <= y -dy[k] < 19 and board[x-dx[k]][y-dy[k]] == z:
                                break
                            
                            print(z)
                            print(x+1, y+1)
                            sys.exit()
                        
                        nx += dx[k]
                        ny += dy[k]
    # 승부 결정나지 않음                    
    print(0)
       
  • プール2コード
  • import sys
    input= sys.stdin.readline
    board = list( list(map(int, input().split())) for _ in range(19))
    dx = [-1, 0, 1, 1]
    dy = [1, 1, 1, 0]
    
    def go(i, j):
        k = board[i][j]
        for d in range(4):
            cnt = 1
            x = i
            y = j
            while True:
                x += dx[d]
                y += dy[d]
                if x < 0 or y < 0 or x >= 19 or y >= 19:
                    break
                if board[x][y] != k:
                    break
                cnt += 1
            if cnt == 5:
                x = i-dx[d]
                y = j-dy[d]
                if  x < 0 or y < 0 or x >= 19 or y >= 19 or board[x][y] != k:
                    return  k
        return  0
                
    result = 0
    for i in range(19):
        for j in range(19):
            if board[i][j]:
                result=go(i,j)
                if result != 0:
                    break
        if result != 0:
            break
    print(result)
    if result != 0:
        print(i+1, j+1)