AtCoder Beginner Contest 007 復習

はい。
http://abc007.contest.atcoder.jp

A - 植木算

Python2

print input()-1

1を引けばよい。植木が1本なら隣り合うものがないので1を引いて0になる。以降は2本あれば1箇所、3本あれば2箇所でいずれも1引いた値になる。

B - 辞書式順序

Python2

print -1 if raw_input()=='a' else 'a'

‘a'が与えられた場合だけ-1を出力する。それ以外で辞書順で小さくするなら'a'だけで済ませられる。

C - 幅優先探索

Python2

r,c=map(int,raw_input().split())
sy,sx=map(int,raw_input().split())
gy,gx=map(int,raw_input().split())
l=[]
for i in range(r):
    c=list(raw_input())
    l.append(c)
l[sy-1][sx-1]=0
q=set([(sy-1,sx-1)])
chk=[(-1,0),(1,0),(0,-1),(0,1)]
while len(q):
    w=q.pop()
    for y,x in chk:
        if l[w[0]+y][w[1]+x]=='#':
            pass
        elif l[w[0]+y][w[1]+x]=='.':
            l[w[0]+y][w[1]+x]=l[w[0]][w[1]]+1
            q.add((w[0]+y,w[1]+x))
        elif l[w[0]][w[1]]+1<l[w[0]+y][w[1]+x]:
            l[w[0]+y][w[1]+x]=l[w[0]][w[1]]+1
            q.add((w[0]+y,w[1]+x))
print l[gy-1][gx-1]

スタートの座標を0歩として上下左右のマスに移動していく。移動先が'.‘で初侵入か、既に侵入済だった場合でも今回のほうが歩数が少なかったならば移動先座標の配列に入れる。上下左右見終わったならば、また配列から座標を取り出して上下左右を見るを繰り返す。繰り返しが終ると、移動先座標の配列が空になっているとゴール座標に最短歩数が入っているようになっている。もしくは今回の問題は必ずゴールへ行けることが保証されているが問題のケースによっては障害物で行けない場合は’.‘などの初期状態のままになっているはずである。

D - 禁止された数字

Python2

a,b=map(int,raw_input().split())
ans=0
if b>10000:
    print 0
    exit()
for i in range(a,b+1):
    i=str(i)
    if '4' in i or '9' in i:
        ans+=1
print ans

部分点解法、満点解法はまた後で。。部分点ならBの最大10000までを4,9のいずれかを含んでいるかを見る方法でも大丈夫。