読者です 読者をやめる 読者になる 読者になる

へっぽこびんぼう野郎のnewbie日記

けろけーろ(´・ω・`)!

CodeIQのpython問題が解けなさすぎる件

※16日に書いてるけど、ネタバレってちょっとマズい気がするから26日に投稿しました

3人の兵士と3体の巨人がルビコン川を渡ろうとしています。 川を渡るには、2人乗りの1艘の船を使うしか方法がありません。 兵士も巨人も同じ強さで、双方が同じ数、もしくは兵士の数が多いとパワーバランスが保てるのですが、 巨人が兵士の数より多いと、巨人は兵士を食べてしまいます。 兵士が巨人に食べられることなく、全員がルビコン川を渡るにはどうしたらよいでしょうか? 兵士はS(Soldier)、巨人はT(Titan)とあらわすことにします。 最初は全員左側の川岸にいる。

SSSTTT/

/SSSTTT
のようにするためのプログラムを書けという問題。
一応こんな風に書いてみた。
sol = 'S’
tit = 'T'
p_val = 0 #食われたか判定する変数
array1=[] #今の状況どもの格納庫
nums = numt =3 #SとTの数
 
def le(nums,numt): #situation of river left(川の左側の状況)
    return sol*nums + tit*numt
def ri(nums,numt): #situation of river right
    return sol*(3-nums) + tit*(3-numt)
def sit(nums,numt): #situation of whole river(両岸全体の状況)
    return le(nums,numt) + '/' + ri(nums,numt) 
 
def eatD(nums,numt): #decision whether eaten or not(食われたか食われてないか)
    global p_val #グローバル変数の読み込み(これググるのに時間かかった)
    if nums == 0 and numt == 0: #『/SSSTTT』のとき
        p_val = 2
    elif nums == 0 or nums == 3:  
        p_val = 1
    else:
        if nums == numt:
            p_val = 1
        elif nums < numt or 3-nums < 3-numt:
            p_val = 0
 
for x in range(4):
    for y in range(4):
        eatD(3-x,3-y) 
        if p_val == 1:
            a = sit(3-x,3-y)
            array1.append(a)
        elif p_val == 2:
            b = sit(3-x,3-y) + '(CLEAR)'
            array1.append(b)
        else:
           pass
print(array1[0]) 

 

こんな感じ。

出力は、

['SSSTTT/', 'SSSTT/T', 'SSST/TT', 'SSS/TTT', 'SSTT/ST', 'ST/SSTT', 'TTT/SSS', 'TT/SSST', 'T/SSSTT', '/SSSTTT(CLEAR)']

こうなる。

 

なんか樹形図とかブルートフォースな感じのことをやるんじゃないだろうかと思って条件式とかひたすらググったのだが、

よくわからない。

よくわからなすぎてハゲそうだった。

 はやく答えクレ。

8時間ぶっぱなしでやって、これだけしかできないって、どういうことですか。

最初見たとき、『これが星2個の問題とかwwwww』って思ったけど、

全然甘かった。

もうやだ。