- 締切済み
解説をお願いします。
どこを変えればよいのでしょうか? #include<stdio.h> int main(void) int n,m,x; char my_turn; printf("最後にタバスコを取った側がピザを食べます\n"); printf("タバスコの数?"); scanf("%d",&n); printf("1回にタバスコを振れる最大の数?"); scanf("%d",&m); if(n < 1 || m < 1) return 0;//負数の入力を拒否します for(my_turn = 1; n!=0; my_turn ^=1){ *1 if(my_turn){ x = (n - 1)%(m + 1);//なぜこの様な式になるのかを特に教えてください。 if(x == 0) x =1; printf("私は %d 回タバスコを振ります\n",x); }else do{ printf("何回振りますか?"); scanf("%d",&x); }while(x <= 0 || x > m || x > n); n = n - x; printf("残りは %d 回です\n",n); } if(my_turn) printf("あなたの負けです\nおいしく召し上がれ"); else printf("私の負けです\nいただきます"); return 0; } 問題の条件を入力した瞬間に,先手か後手かどちらか必勝かが分かります. そこで,先手必勝の場合はコンピュータが先手を選択し,後手必勝の場合は,コン ピュータは必ず後手を勝手に選択する処理を追加し,人間がコンピュータに絶対に 勝てないプログラムに変更する、
- みんなの回答 (6)
- 専門家の回答
みんなの回答
No.4,5です。 ゴメンなさい。 違っていましたね。 すでに、別に質問なされているところの回答が正解でしたね。 失礼しました。
No.4です。 勘違いしていました。 No.4のnを最初に-1して条件を適用すれば、そのままでいいような気がします。 つまり、最後に相手に1にして渡せば、いいですからね。
ご提示のプログラムが正しいのかよくわかりませんが、考え方を書きたいと思います。 最後に自分が勝つためには、最後に自分に回ってきたときに、m以下の数であれば勝てます。 (当然、自分へ回ってきたのですから、1回以上は振れるはずです) 逆に考えれば、相手へは(m+1)で渡せばいいことになります。 具体的に書けば、m=3とした場合はタバスコの数を4にして相手に振らせればいいことになります。 それを発展させて考えれば、タバスコの数を常に(m x i + 1)にして相手に振らせれば良いことになります。(iは1以上の整数) 基本的に先手必勝ですが、そうならない場合の条件は最初、nの数が(m x i + 1)となる場合となります。 ですから、上記の場合にのみコンピュータは後手を選択し、(m x i + 1)にして相手にタバスコを振らせればいいことになります。 ですから、先手、後手の判定は if(n % m == 1) の時に後手にすればいいと思います。 また、自分が何回振るかは n - (n / m * m + 1) となります。 また当然のこととして、nがm以下の時には、自分がn回振って勝ちます。 (サンプルのプログラムはチョット違うような気がしますけど)
- edomin7777
- ベストアンサー率40% (711/1750)
またまた、#1です。 x = (n - 1)%(m + 1);//なぜこの様な式になるのかを特に教えてください。 を見逃していました。 こういう書き方をしているということは、必勝法自体が判っていないですよね? 因みに、回答者側には必勝法は判りません。 なぜなら、「ルール」が示されていないからです。 どういうときに、どうなったら勝ちor負けが判らないので、必勝法もなにもありませんよね?
- edomin7777
- ベストアンサー率40% (711/1750)
#1です。 挿入部分は、 return 0;//負数の入力を拒否します と for(my_turn = 1; n!=0; my_turn ^=1){ *1 の間です。 この間で必勝パターンを判定し、「my_turn」の値を1か0に設定するだけ。
- edomin7777
- ベストアンサー率40% (711/1750)
じゃあ、どういうときが「必勝」のパターンなのかを補足してください。