Codeforces Beta Round #7
はい。 http://codeforces.com/contest/7
A. Kalevitch and Chess
brute force,constructive algorithms
ざっくりと大意
・Kalevitchさんが8*8をWで埋まってる板をBで塗る。
・塗り方は一度に一列一直線のみなのかな?
・Inputは塗り終わり姿かな?一列一直線で塗って同じ姿に塗り上げる最小手数を出力。
方針のようなもの
・一行ずつみてWが含まれてなければ一直線でBに塗る列なので手数を1加算。
・最終行までみたら90°回転させて同じ法則で1加算。
・なお回転させる前に手数8になってたら既に全てBで塗りつぶしなので色々終わりにしたい。
提出したものを不要な行消したりコメント入れ
#!/usr/bin/env python # -*- coding: UTF-8 -*- l=[] m=[[]]*8 ans=0 for i in range(8): l.append(sys.stdin.readline().strip()) for j in l: #W がなければBで塗りつぶす直列なので手数を1加算 if 'W' not in j: ans+=1 chk=ans chikan=[[] for i in range(8)] #すでに8手になってる時はこの判定で少しでも処理を省略するつもりだった if chk!=8: #リストを90°回転。ちょっとここだけまた別にソース貼ります。 for k in range(8): v=[] for n in range(8): v.append(l[n][k]) l1=''.join(v) chikan[k]=l1 for p in chikan: if 'W' not in p and chk!=8: ans+=1 print ans
リストを90°回す
与える文字列例
e.g.元の文字列 縦8 横8
abcdefgh
ijklmlop
qrstuvwx
yzABCDEF
GHIJKLMN
OPQRSTUV
WXYZ1234
567890!?
#この場合a,bは共に8とする (a,b)=map(int, raw_input().split()) x=[sys.stdin.readline().strip() for x in range(a)] print x #['abcdefgh', 'ijklmlop', 'qrstuvwx', 'yzABCDEF', 'GHIJKLMN', 'OPQRSTUV', 'WXYZ1234', '567890!?'] chikan=[[] for i in range(8)] #元々のリストのx[0]から読み込んでいく for a in range(8): #仮格納のリストを初期化する tate=[] #a列のb番目の要素をなめていく for b in range(8): tate.append(x[b][a]) #1文字ずつバラバラなのを結合して正式格納用のリストに入れる tate1=''.join(tate) chikan[a]=tate1 print chikan #['aiqyGOW5', 'bjrzHPX6', 'cksAIQY7', 'dltBJRZ8', 'emuCKS19', 'flvDLT20', 'gowEMU3!', 'hpxFNV4?']
ちなみに最初に横に見た時に既に手数8でも気にせずに縦を見に行って最終で16ならば8に変えるという処理の仕方の人もいた。ふむー。
縦列を見るのは大体の人が2重ループで似た処理っぽい気がした。
なるほどわからんな処理の人がいたので抜き出し。 5517398のmashashmaさん
k = 0 g = 0 for i in range(8): a = raw_input() w = a.count('W') b = a.count('B') if b == 8: k = k+1 elif w < 8 and b < 8 and g == 0: g = g+1 k = k+b print k
わりと今夜はあっさりA解けたのでB行けるかと思ったら英語が何言ってるかわからじ。。。。