• ベストアンサー

石取りゲーム

石の山がいくつかあって、2人で交互に石の山から石を取っていき、最後の石を取ったほうが負けというゲームがあります。 山の数はいくつでもいいのですが、それぞれ山の石の個数をa,b,c,d,・・・・としたとき、 最初の山の状態は、a≧b≧c≧d≧・・・とします。 石の取り方は、 ・好きな山から、任意の個数を取る。 ・取ったあと、a≧b≧c≧d≧・・・の関係が成り立つように別の山から石が除かれる。 たとえば、 (10,9,9,6,3)の山があった場合、 2番目の山から4個とって5個にしたら、3番目以降の山からも5個を超えた分だけ石が除かれて、 (10,5,5,5,3)となります。 山が2つの場合は、(k,k-1)の状態を良形とすれば、 自分の手番のときに、良形にできれば必勝となります。 では、山が3つの場合や4つの場合、必勝となるための良形とはどんな状態でしょうか。 良形かどうかを簡単に確認する方法はあるでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • B-juggler
  • ベストアンサー率30% (488/1596)
回答No.6

No.2です。 了解しました。チョンプですね。 だったら未解決ですね。この形だと、少し先にいけるかもと思ったけど。 あまり深く追求するのはやめておきましょう^^; (4,2,1)は勝てないですね すみません。 (4,2,2)で、手番負けなんですね・・・。 (3,1,1)も手番負けだから、ひょっとすると、 (j+2、j,j) のときは、手番負けなのかも? で、話が変わりますが、順序が違ってしまったけど 何をやろうとしていたかを書いていなかったです。 2つの山の場合、勝つパターンは分かった。 ↓ 3つの山のとき、勝つパターンと、負けるパターンを探し出し 一般化する。 ↓ 4つの山のとき、一部ではあるだろうけれど拡張可能。と見ていました。 なので、3つの山での、「手番勝ち」、「手番負け」を探していました。 多分、(k,k,k)は手番勝ちですね。 だとすると、(2,2,2,1)となったとき、手番負けですよね。  #多分そうだよ・・・。 この形式なら少し先にいけるのかもね。 気が向いたら^-^

nag0720
質問者

お礼

紹介していただいたサイトに書かれていましたが、 (k,k,k,・・・,k)は先手必勝ですね。 チョンプの盤で考えると縦と横を入れ替えてもゲームとしては同じなので、 (k,k-1) と (2,2,2,・・・,2,1) は同じ形になり、どちらも後手必勝です。 3つの山で、3番目の山が0~2個の場合は、 (k,k-1,0) (k≧1) (3,1,1) (2,2,1) (k,k-2,2) (k≧4) が後手必勝になることまでは分かったのですが、3個以上の場合は不規則になるようで、何か規則性はないかと質問した次第です。 とりあえず締め切りますが、何か分かったらまた質問しますので、よろしく願いします。

その他の回答 (5)

  • B-juggler
  • ベストアンサー率30% (488/1596)
回答No.5

こんばんは No.2です  えっと、チョンプ なのかどうかちょっと分かりかねますが、 こういうページがありましたので、一応。 http://www.lab2.kuis.kyoto-u.ac.jp/~itohiro/lecture/Nim08-web.pdf アクロバットリーダーがいるけど、組み合わせゲーム理論の講義内容みたいですね。 これは正直、難しいと思う。 何でもかんでも式化すればいいかって話で・・・。 私どちらかというと普段はやらないんだよね。  #なので、半分本職なのね。 3つの山を考えていますが それぞれ 大きい順に L、M、S (ポテトかっヽ(・∀・)ノ ) としておきます。 今、LとMの差が 1 のとき、 何も考えず、先手必勝。 (L,M,S)・・(k+1,k,any(≦k) ) こうなっているときは、黙って、anyを全部とって、2つにして勝ちですね!  何も断りを入れていないけど、kは自然数ね。  any≠0ね LとMの差が2以上のとき、条件満たさなければ先手必敗だと思うんだけどね~。  #まだ微妙・・・。 (k+2,k,any) のときに、 any(Sの山から)全部は取れないですね。  #(k+1,k)作られて負け。 k+1も作れないよね (Lの山から一本)  #これは any 全部取られて負けだね。 (3,1,1)で、先手が勝てる手があるかどうか。 多分ないかなぁ~?? ところが(4,2,2)なら勝ちなのよね。 Sの山から 一本とって (4,2,1)で勝ちですね。 これで後手は動けない。 2進数で考えたほうが少し得かな? 4=(100)2進数 → これを 一本とみなす。 2=(10)2進数 → 同じく一本とみなす。 そうすると、 (4,2,1)は (1,1,1)と同じ。 でもこの場合はダメなのよね。う~ん、難しいね。 (1,1,1)は先手勝ち。 Mの山を取れば、(1,0,0)で終わり。 (4,2,1)は、この方法が使えない。(4,0,0)なら、先手勝ちだもん。 (4,1,1)にするしかないけど、先手は(3,1,1)にして、後手に手無し。  #(3,2,1)は、Sとって先手勝ちね。 今のところ考えている三つの山の場合、「LとMの差が1のとき」 「(1,1,1)~(4,4,4) 同じ数の山」  #(5,5,5)が大丈夫かどうか検討中。  #(5,3,3)で後手に手がなければ、先手勝ち。  #これができれば、(J(≦k+2),k,k(≠1) が大丈夫) これは大変な問題だ! 数学オリンピックかなんかかな?

nag0720
質問者

お礼

回答ありがとうございます。 このゲームは表現方法はちょっと違いますが、まさしくチョンプでした。 LとMの差とか2進数で考えるというのは参考になりました。自分でももう少し考えてみます。 この問題は、(5,5,5,5,5)のときどうすれば勝てるかというクイズがあって、 正解は、(5,1,1,1,1)にして、あとは1番目の数と山の数を同じにしていけば勝てるということでした。 例えば、 (5,1,1,1,1)→(4,1,1,1,1)→(4,1,1,1,0) (5,1,1,1,1)→(5,1,1,0,0)→(3,1,1,0,0) これを一般化したらどうなるかと考えてしまいました。 このことから、(3,1,1)は後手の勝ちですね。 (4,2,1)は後手勝ちと書かれていますが、 (2,2,1)にすればいいので、先手勝ちではないでしょうか。 (4,2,2)が後手勝ちのようです。 ともかく、未解決の問題だということが分かっただけでも質問した甲斐がありました。

  • 2ac0uO
  • ベストアンサー率60% (9/15)
回答No.4

これはチョンプと言うゲームで、多分現在でも未解決だろうと思います。 必勝法が知られているのは、(N,1,1,1,・・・,1)と言うパタンと、 (2,2,2,・・・,2,1,1,・・・,1)と言うパタンくらいではないかと思います。

nag0720
質問者

お礼

チョンプと言う名前があったんですね。知りませんでした。 ありがとうございます。 未解決でしたか。 三山崩しのように簡単な計算で判断できないかと思ったんですが無理のようですね。 (N,1,1,1,・・・,1)(山の数がN個)のパタンは分かっていましたが、 (2,2,2,・・・,2,1,1,・・・,1)と言うのは? (2,2,2,・・・,2,1)ではないですか?

nag0720
質問者

補足

チョンプで検索したらいろいろ出てきました。 やはり一筋縄ではいかないようですね。

回答No.3

#1です。 大きな勘違いしていました m(_ _)m 3目並べは全く関係ないですね ^ ^; 2進法がキーワードです

  • B-juggler
  • ベストアンサー率30% (488/1596)
回答No.2

ゲーム理論かな? ニムのゲームに似ているけど、少し違うんだね。 半分本職領域なので、ちょっと考えておきますね m(_ _)m 一つだけ確認。山が二つで、(2,1)が勝ちなら、 相手は二個取れば負けでいいんだね。取り除かれた分も自分がとったことになるんだね。 これだけ確認させてください。補足して貰えると助かります。  #まぁ、でもそういうことなんだろうけど。 自分(2,1){にする} → 相手(1,1) →自分(1,0) これで勝ちだよね。 後は拡張すればいいのか・・・。ちょっと考えさせて。

nag0720
質問者

お礼

>取り除かれた分も自分がとったことになるんだね。 そうです。 (k,k-1)のとき、 相手が1番目の山から何個か(全部じゃなく)取った場合、(k,k)の形になるので、自分は2番目の山から1個取れば、(k,k-1)の形になります。 相手が2番目の山から何個か取った場合、自分は1番目の山から同じ数だけ取れば、(k,k-1)の形になります。 最終的に(1,0)になって、相手が最後の石を取ることになります。 問題は、山が3つ以上の場合です。

回答No.1

宿題かな? 3目並べで検索すれば解法はあるような気がします

関連するQ&A

  • 石取りゲームを3人でする

    次のような状況の石取りゲームを3人でする場合は必勝法はあるのでしょうか。 Aさん(=自分)、Bさん、Cさんの三人で石取りゲームをするとして、石は50個、1回に一人1~3個石を取れるとします。2人で結託しちゃうと必ず勝てるとは思いますが、今回はだれも結託なし、つまり自分以外の2人は1~3個の石を毎ターン何個とるかわからない状況でゲームをします。 Aさんの次はBさん、次にCさん(Cさんの次はAさん)のように石をとりますが、Aさんは一番最初にだれがとるか指名することができるとします。 このような状況下でAさんがかつ必勝法などあるでしょうか。あったら教えてほしいです。

  • 石取りゲームの必勝法

    石取りゲームといえば「石が30個あり、自分の番には最低1個から最大3個取らなければならない。最後の一つを取ったら負け。」のようなルールが一般的だと思います。 この場合、必勝法としては自分の番で4の倍数+1の数にしておけば勝てます。 しかしこれでは面白くないので、このゲームを難しくしようとしてみました。 そこで、石が50個あり「取れる石の数が3~6個」、というルールではどうかと思ったのですが、取る石の数が逆算出来ません>< どなたか数学の得意な方ご回答よろしくお願いします! できれば、方程式で書いていただけるとありがたいです。 (最初の例なら 石の数=a  石を取れる最大数=b 取る数=xとすると、  x=(a-1)/(b+1) この1が石を取れる最低数の1ってことなのでしょうか.....)

  • 次の石とりゲームに必勝法はありますか

    二人で石を取り合うゲームがあります。 ゲームのルールは次の通りです。 ・石の数は60個。 ・二人で交互に石を取り合う。 ・1回の手番で取れる石の数は1個~3個。 ・石がなくなったとき、とった石の数が多いほうが勝ち。 ・ただし、最後の1個は、石30個分として扱う。 このゲームに必勝法はありますか。 もしあるなら、どうしたら勝てますか。 また、最初の石の数が60個ではなく、N個だった場合、 どういう戦略なら勝つことができるのでしょうか。

  • ある文字の入ってる行の個数を求めたい。

      A  B  C         D 1  海  山  川    =OR(A1="山",B1="山",C1="山" 2  山  山  海    =OR(A2="山",B2="山",C2="山" 3  川  海  海    =OR(A3="山",B3="山",C3="山" 4               =COUNTIF(D1:D3),TRUE           上記の表で"山"が有るセルを含む行の個数を表示したい。 今は上記の表の脇に次のようにしてますが、もっと良い方法が、 あるかと思い質問します。宜しくお願いします。 =OR(A1="山",B1="山",C1="山" 1の行に"山"が有ればTRUEとして これを各行で行い=COUNTIF(D1:D3),TRUEで結果、”2”と行の個数を 求めてます   

  • ばば抜き石ころ版必勝法

     石ころ、豆、ビー玉などなんでもいいのですが二つの山をつくります。最後の1個をとったほうが負けというこどもの遊びです。この必勝法を数学的に説明してください。  ルール  1 各山の玉数は任意  2 二人でいずれかの山から玉を1個以上を交代にとってゆく。両方の山からはとれません。  例1  Aの山には5、Bの山には6あるとしましょう。あなたならどうしますか。  解答例  Bから1とります。次に相手がAから3とれば、Bから3とります。残りは2ずつですね。  相手がAから1とればBから2をとります。相手が2とれば残りの山Bから1とれば勝ちと  言う寸法。 つまり二つの山の玉数を同じにするのがこつ。  私は数回でこれに気づき以後負けなし。  例2  山の数が3の場合、どうやったか思い出せませんが勝率は7割以上と記憶しています。  A5、B4、C3としましょう。相手が一つ山から全部とったら例1と同じですね。相手がAから  1とればCから3をとる。ABとも4.。2ならBから4をとる。ACとも3。これ以外の組み合わせは  思い出せません。  例3  対戦人数を3人に増やすと複雑になって必勝法は通用しませんでした。    

  • エクセル関数で一番多いの次に多いの…と数えたいです。

    日に何回もお世話になります。 今A1の列にアルファベットが入っています。それを一番多いのは何で何個。次に多いのは何で何個と数えたいです。 COUNTを使っても数しか数えてくれません。ご教授ください。    A1     b    b    b   c  c    a 1番 b 個数 3 2番 c 個数 2 3番 a 個数 1

  • 4つの袋AからDがあり、袋の中には幾つかの碁石(黒、白)が入っており、

    4つの袋AからDがあり、袋の中には幾つかの碁石(黒、白)が入っており、次に事がわかっている。 (1)Aには合計10個以上の石が入っている (2)Bには黒石9個、白石5個、Cには黒石5個、白石6個、Dには黒石3個、白石4個がそれぞれ入っている (3)袋から任意に1個の石を取ったときそれが黒石である確率は、Aの方がBよりも高く、またCの方がDよりも高いが、逆にAとCを合わせたものと、BとDを合わせた物を比較すると後者の方が前者よりも高い。 この時Aに入っていた黒石の個数は何個か? 答え8個 解かりやすく教えて頂けないでしょうか?

  • またまたエクセルの文字列照合の疑問

    エクセルの処理でいきづまってしまったのですが、 例えば  A B C D  1朝   人 傘 2昼   町 朝 3夜   魚 山 4顔   草 月 5人   川 石 とエクセルで並んでいたとき  A B C D  1朝 D 人 傘 2昼   町 朝 3夜   魚 山 4顔   草 月 5人 C 川 石 のようにB列にA列に並んでいる漢字がどの列の漢字に該当しているかを出したいです。ちなみにC、D列には800文字ほど並んでいて重複はありません。 簡単そうですが、わかりません。 誰か詳しいお方模範解答をお願いします。

  • 順位変更の登記について

    不動産登記法の担保権の順位変更について、どなたか教えていただけないでしょうか? 仮に、登記簿上、1番A、2番B、3番C、4番Dとなっているとします。全て抵当権者です。 この場合、下記、ご回答お願いします。 質問1: 2番B、3番C、4番D番だけで、順位変更をすることは出来るのでしょうか? その場合、1番A、2番D、3番C、4番Bというように出来ますか?2~4番抵当権をD、C、Bの順位に入れ替えました。 質問2: 2番Bと4番Dだけで順位変更は出来ますでしょうか? 3番Cが当事者にならないということです。 また、その場合の順位は、1番A、2番D、3番C、4番Bになるのでしょうか?

  • 3次方程式の実数解の個数のプログラムについて…

    C++で、3次方程式の実数解の個数を調べるプログラムを作ってみた(↓)のですが、実行したときに問題点があって困っています。 #include<stdio.h> #include<math.h> void main(void) /*3次方程式の実数解の個数*/ { double a,b,c,d,D,A,B; printf("f(x)=a*pow(x,3)+b*pow(x,2)+c*x+d=0 に対して、a,b,c,dの値を定めると、\n"); scanf("%lf %lf %lf %lf",&a,&b,&c,&d); D=4*pow(b,2)-12*a*c; A=(-b+sqrt(b*b-3*a*c))/(3*a); B=(-b-sqrt(b*b-3*a*c))/(3*a); if(a>0) if(D<=0 || (D>0 && A>0) || (D>0 && B<0)) printf("実数解の個数は1個\n"); else if(A<0 && B>0) printf("実数解の個数は3個\n"); else printf("実数解の個数は2個\n"); else a=-a; b=-b; c=-c; d=-d; if(D<=0 || (D>0 && A>0) || (D>0 && B<0)) printf("実数解の個数は1個\n"); else if(A<0 && B>0) printf("実数解の個数は3個\n"); else printf("実数解の個数は2個\n"); その問題点というのは、実数解の個数が2個と3個のときは、実行したときの結果として、 実数解の個数は2個 Press any key to continue あるいは 実数解の個数は3個 Press any key to continue と正しく表示されるのですが、実数解の個数が1個のときは、 実数解の個数は1個 実数解の個数は1個 Press any key to continue と「実数解の個数は1個」が2回表示されてしまうのです。 なぜ、2回表示されるのか分かりません。 初心者なので、できるだけ詳しい解決法などよろしくお願い致します。