[ProblemSolving]Back-2615グラビア(実装)
18851 ワード
提问链接
問題の説明
五子棋は碁盤の白黒の駒が交互に対戦するゲームである.碁盤には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を返す.
ホームから返された値でなければ勝負が決まるので、逃げて出力します.
コード#コード#
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)
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)
Reference
この問題について([ProblemSolving]Back-2615グラビア(実装)), 我々は、より多くの情報をここで見つけました https://velog.io/@redcarrot01/ProblemSolving-백준-2615-오목-구현テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol