君はまるで砂漠に咲く、一輪の花。

僕はその花に引き寄せられる蝶。

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]))