プロが教えるわが家の防犯対策術!

https://onlinejudge.u-aizu.ac.jp/problems/ITP1_6_B

この問題のアルゴリズムを教えてください。

A 回答 (2件)

ん?これ



https://oshiete.goo.ne.jp/qa/13380583.html

と同じじゃねぇの?
マルチポストはダメだよ。

んで、

> この問題のアルゴリズムを教えてください。

ぶっちゃけ、「アルゴリズム」って程じゃねぇだろ。
言い換えると「どうとでも解ける」。

あっちで掲載した実装例

https://www.ideone.com/W4n9Gd

はこういう考え方だ。
トランプがある。「印字する」か「印字しないか」は2つに1つだ。
つまり二値なわけだな。
二値だからbool値(あるいは真偽値)を利用する。
bool値が真の時印字してbool値が偽の時は印字しない。
そういう状況を最終ゴールにする、って辺りから考えていくんだ。
そういうbool値の「フラグ」をどこに置くか、って考えた時、C言語なら「トランプの構造体自体に仕込めば良い」って判断になる。他の言語ならまた違うけど、C言語だと素の状態じゃあんま自由度がないからそうしてる。
フラグ込みのトランプの構造体を要素とした配列を作る(bool値は「全部印字される」前提でtrueにしておく)。問題に従ってその配列は52の要素がある。
これでほぼ終りだ。
あとは、入力を見て、例えば「S 10」って入力があったらトランプの配列(デッキ)を調べて一致した要素(つまり「S 10」だな)のbool値をfalseに変更する。そうすれば自然と印字用途からは外れるわけ。

あのプログラムの、おそらく一番メンド臭いトコはstring.hのstrtok関数の使い方だろうけど、それは適当なリファレンスを見て。

C言語 strtok 使い方 :
https://bituse.info/c_func/18

単純に言うと、標準入力から例えばS 10と来るとそれは文字列としてbuffer変数に"S 10"として格納される。
それを空白文字を利用して"S"と"10"の2つの文字列に分けるのがstrtokだ(厳密に言うと違うんだけど、他の言語だとそういう考え方になる)。
あとはトランプの配列を舐めて行って、"S"の文字要素である'S'と、文字列"10"からstrtol関数で数値に変換された10と一致してる要素を探してるだけ、だ。

【C言語】strtol関数|strto関数群(strtol, strtoul, strtoq, strtouq)完全解説:
https://marycore.jp/prog/c-lang/stdlib-strtol/

以上。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2023/03/08 13:32

実際にトランプを使ってそれをやれっていわれたら, あなたならどうする?

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!