Codeforces Round #168 (Div. 2)
はい。
http://codeforces.com/contest/275
A. Lights Out
ざっくりと大意
・3x3のマスでライトが点灯するボードがある?? ・とあるマスを押すとそのマス自身と四方のマスが点灯/消灯の状態が反転する?? ・3x3のマスを押した回数が与えられるので最終はどんな状態か?? ・初期状態は全て1で反転は0
方針のようなもの
・全部そのまま1ずつ加算してシミュレートするのではなく押す回数を足して保存して、最後に%2の余りで状態を判定
w=[[1,1,1],[1,1,1],[1,1,1]] for i in range(3): l=[int(x) for x in raw_input().split()] for j in range(3): if l[j]: if i==0: if j==0: w[0][0]+=l[j] w[0][1]+=l[j] w[1][0]+=l[j] elif j==1: w[0][0]+=l[j] w[0][1]+=l[j] w[0][2]+=l[j] w[1][1]+=l[j] else: w[0][2]+=l[j] w[0][1]+=l[j] w[1][2]+=l[j] elif i==1: if j==0: w[0][0]+=l[j] w[1][0]+=l[j] w[1][1]+=l[j] w[2][0]+=l[j] elif j==1: w[0][1]+=l[j] w[1][0]+=l[j] w[1][1]+=l[j] w[1][2]+=l[j] w[2][1]+=l[j] else: w[1][1]+=l[j] w[1][2]+=l[j] w[0][2]+=l[j] w[2][2]+=l[j] else: if j==0: w[1][0]+=l[j] w[2][0]+=l[j] w[2][1]+=l[j] elif j==1: w[1][1]+=l[j] w[2][0]+=l[j] w[2][1]+=l[j] w[2][2]+=l[j] else: w[2][2]+=l[j] w[2][1]+=l[j] w[1][2]+=l[j] for i in range(3): print str(w[i][0]%2)+str(w[i][1]%2)+str(w[i][2]%2)
全部力技で書いた。。。
あまりにも力技があり得なさすぎたので他の人の回答を見た。lovefly1983さんの http://codeforces.com/contest/275/submission/3166086 をパクった。四方の座標を相対で準備?と範囲外を見に行かないようにすればあんな力技は要らなかった。
#all around d=[(0,0),(1,0),(-1,0),(0,1),(0,-1)] def f(m,i,j): ret=0 for dx,dy in d: #ignore the out of range if i+dx>=0 and i+dx<=2 and j+dy>=0 and j+dy<=2: ret+=m[i+dx][j+dy] return ret m=[map(int, raw_input().split()) for _ in xrange(3)] ans=[[0]*3 for _ in xrange(3)] for i in xrange(3): for j in xrange(3): ans[i][j]=(f(m,i,j)+1)%2 for i in xrange(3): print ''.join(map(str,ans[i]))