#---------- 入力例 ---------- cows = 'BBFBFBB'# F:前向き、B:後ろ向き #---------------------------- n = len(cows) # 牛の頭数 k = 1# 求める最小の牛を回転させる連続頭数(初期化) m = n # 求める最小の操作回数(初期化)
# 牛を回転させる連続頭数kを固定した時の最小操作回数を求める # 解が存在しない場合は -1 を返す defcalc(k): # 区間[i, i + k - 1 ]を回転させたかどうか f = [0for _ inrange(n)] res = 0# 操作回数 total = 0# リストfの和 for i inrange(n - k + 1): if (dir[i] + total) % 2 != 0: # 先頭の牛が後ろを向いている場合 # 回転操作を行う res += 1 f[i] = 1 total += f[i] if i - k + 1 >= 0: total -= f[i - k + 1] # 残りの牛が前を向いているかどうかチェック for i inrange(n - k + 1, n): if (dir[i] + total) % 2 != 0: return -1 if i - k + 1 >= 0: total -= f[i - k + 1] return res
# 牛の方向を0(F:前向き),1(B:後ろ向き)に変換 dir = [0if x == 'F'else1for x inlist(cows)]
for i inrange(1, n + 1): # 牛の頭数分ループする print(i, '頭回転させる機械の場合') x = calc(i) if x >= 0and m > x: # 牛を全部前向きにでき、かつ操作回数がより少ない場合 print(x, '回操作で牛を全部前向きにできる。') m = x # 最小の操作回数を更新 k = i # 回転させる最小の連続頭数を更新 else: print('牛の向きを全部前向きにするとはできない。') print()
# 縦を圧縮 lst = [] # 縦を圧縮したデータ pre = ''# 1行前のデータ(初期化) for line in mp.split(): if pre != line: lst.append(line) pre = line # 横を圧縮 pre = ''# 1列前のデータ(初期化) w = 0 for col inrange(len(lst[0])): # 列ごとにループ row = [l[col] for l in lst] # 1列分のデータを取得 line = ''.join(row) if pre != line: for y, s inenumerate(list(line)): mp_compress[w, y] = s w += 1 pre = line
print(' 【 圧縮後 】 ') for y inrange(len(lst)): for x inrange(w): print(mp_compress[x,y], end='') print()
# 深さ優先探索(Depth-First Search) defdfs(x, y): global mp_compress # 今いるところを#に置き換え mp_compress[x, y] = '#' for dx, dy in [(1,0), (-1,0), (0,1), (0,-1)]: pos = (x + dx, y + dy) if pos in mp_compress and mp_compress[pos] == '.': dfs(pos[0], pos[1]) # 領域を数える cnt = 0 for pos,v in mp_compress.items(): if v == '.': dfs(pos[0], pos[1]) cnt += 1 print('解:', cnt)