prettify

2016年5月27日金曜日

"埋め立て" AtCoder Regular Contest 031 B

B - 埋め立て

解法
深さ優先探索の典型的な問題。実装は蟻本を参考にしました。
関数dfsはまずスタート位置を"x"にして、スタート位置から移動できる先が"o"ならそこをスタート地点にしてまたdfs、という再帰になっています。
(x,y)のコマを埋め立てたときに島が一つになっている場合は、dfs(x,y)が終わると地図が全部"x"で埋まります(島が一つでない場合は"o"が残る)。これを関数checkでチェック。
スタート地点は10*10箇所しかないので全部試す。

# ARC031B
import copy
field = []
for p in range(10):
    field.append([str(x) for x in str(input())])
 
temp = copy.deepcopy(field)
 
dx = [1,0,-1,0]
dy = [0,1,0,-1]
 
 
def dfs(x,y):
    temp[x][y] = "x"
    for p in range(4):
        nx = x + dx[p]
        ny = y + dy[p]
        if 0<=nx<10 and 0<=ny<10 and temp[nx][ny]=="o":
            dfs(nx,ny)
    return
 
 
def check():
    for p in range(10):
        for q in range(10):
            if temp[p][q] == "o":
                return False
    return True
 
 
for p in range(10):
    for q in range(10):
        temp = copy.deepcopy(field)
        dfs(p,q)
        if check() == True:
            print("YES")
            exit()
print("NO")

0 件のコメント:

コメントを投稿