「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。

MENU

アルゴリズムの学習(003/XXX)

 コンピュータ科学を学ぶべくアルゴリズムを学んでいく。参考として定番書であり古典的名著でもある

を用いる。実装には勉強もかねてC#を使う。

4. 石取りゲーム1

以下のルールで石取りゲームを行う:

  (1) 石の数nおよび1回で取れる石の最大数mを決めた上で、相手→自分の順番で石を取っていく。
  (2) 最後の1個を取った方が負けになる。
  (3) パスはできない。

このゲームは残った石の数を(m+1)k+1個(k\in\mathbb{N})にできれば、相手の取った数と自分の取った数が[tex:m+1になるように自分の取る数を決めることで必ず勝つことができる。このような形にできなければ1個だけ取って相手の敗着を待つ。

using System;
using System.Collections.Generic;
using System.Linq;

namespace Ishitori
{
    class Program
    {
        static void Main(string[] args)
        {
            int n, m, r, my_turn;
            int x = 1;

            Console.WriteLine("石の数は?");
            n = int.Parse(Console.ReadLine());

            Console.WriteLine("1回で取れる石の最大数は?");
            m = int.Parse(Console.ReadLine());

            // 例外処理
            if(n < 1)
            {
                throw new Exception("石の数は正の整数を指定してください。");
            }

            if (m < 1)
            {
                throw new Exception("1回で取れる石の最大数は正の整数を指定してください。");
            }

            for (my_turn =1; n !=0; my_turn ^= 1) //^=は排他的論理和で左辺と右辺が一致すれば0,そうでなければ1を返す
            {
                if (my_turn == 1)
                {
                    x = (n - 1) % (m - 1);
                    if (x == 0) x = 1;
                    Console.WriteLine("私は{0}個の石を取ります。",x);
                }
                else
                {
                    do
                    {
                        Console.WriteLine("あなたは何個取りますか?");
                        r = int.Parse(Console.ReadLine());
                        x = r;
                    } while (r < 1 || x <= 0 || x > m || x > n);
                }
                n -= x;
                Console.WriteLine("残りは{0}個です。", n);
            }
            if (my_turn==1) {
                Console.WriteLine("あなたの負けです。");
            }
            else
            {
                Console.WriteLine("あなたの勝ちです。");
            }
        }
    }
}

 結果は以下のとおり:

           
プライバシーポリシー お問い合わせ