深さ優先探索のお勉強1 AOJ0033 Ball
いかんせんアルゴリズムについての知識がないということで,ここで挙げられている頻出アルゴリズムくらい自力で解いてみようと思い立ってみました.
http://d.hatena.ne.jp/kyuridenamida/20111009/1318087144
ということで,まずは深さ優先探索から.
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0033
#! c:/Python27/python.exe # -*- coding: utf-8 -*- input = 'AOZ_0033_input.txt' output = 'AOZ_0033_output.txt' def step(B, C, i, ball, ans): if i == len(ball): ans.append(1) elif B[-1] < ball[i]: B.append(ball[i]) step(B, C, i+1, ball, ans) elif C[-1] < ball[i]: C.append(ball[i]) step(B, C, i+1, ball, ans) else: ans.append(0) def step2(B, C, i, ball): if i == len(ball): return True elif B[-1] < ball[i]: B.append(ball[i]) step2(B, C, i+1, ball) elif C[-1] < ball[i]: C.append(ball[i]) step2(B, C, i+1, ball) else: return False if __name__ == '__main__': f = open(input) fout = open(output,'w') num = int(f.readline()) for i in range(num): ball = f.readline().split() for i in range(len(ball)): ball[i] = int(ball[i]) B, C, ans = [0], [0], [] step(B, C, 0, ball, ans) result = ans[0] print "Case #"+str(i+1)+": " + str(result) fout.write("Case #"+str(i+1)+": " + str(result) + '\n') fout.close()
で,一応問題自体は解けたんですが,なんか変なところで嵌りました.本当はstep2という関数でT/Fを返したいのですが,上記のままでは動きません(正確に言えば真偽値を何も返しません…).仕方なくansというリストをへんてこな感じにいれてみたんですが,これ本来はどのように書くのが正しいのでしょうか….再帰の書き方を間違えてるんでしょうかね….なんかやっぱりPythonの仕様がきちんとわかってないようです.もう一度『はじめてのPython』を読み直そうかと思います….と,深さ優先探索とは全然別のところで嵌っていたというお話.