トップページに戻る    次の増井さんの書籍の問題へ    前の増井さんの書籍の問題へ

Q16 3本のひもで作る四角形


C#のソース

using System;
using System.Collections.Generic;

class Program
{
    struct TyouhoukeiInfo
    {
        internal int YokoHaba;
        internal int TateHaba;
    }

    struct AnswerDef
    {
        internal int SeihoukeiHaba;
        internal TyouhoukeiInfo Tyouhoukei1;
        internal TyouhoukeiInfo Tyouhoukei2;
    }
    static List<AnswerDef> AnswerList = new List<AnswerDef>();

    static void Main()
    {
        int AnswerCnt = 0;
        for (int I = 1; I <= 500; I++) {
            //正方形の面積
            if (I % 4 > 0) continue;
            int wkSeihoukeiHaba = I / 4;
            int MensekiSeihoukei = wkSeihoukeiHaba * wkSeihoukeiHaba;

            TyouhoukeiInfo[] KouhoTyouhoukeiArr = DeriveKouhoTyouhoukeiArr(I);

            int UB = KouhoTyouhoukeiArr.GetUpperBound(0);

            Func<TyouhoukeiInfo, int> DeriveMenseki = pTyouhoukeiInfo =>
                pTyouhoukeiInfo.TateHaba * pTyouhoukeiInfo.YokoHaba;

            for (int J = 0; J <= UB; J++) {
                int MensekiTyouhoukei1 = DeriveMenseki(KouhoTyouhoukeiArr[J]);
                for (int K = J + 1; K <= UB; K++) {
                    int MensekiTyouhoukei2 = DeriveMenseki(KouhoTyouhoukeiArr[K]);
                    if (MensekiTyouhoukei1 + MensekiTyouhoukei2 != MensekiSeihoukei)
                        continue;

                    AnswerDef wkAnswer;
                    wkAnswer.SeihoukeiHaba = wkSeihoukeiHaba;
                    wkAnswer.Tyouhoukei1 = KouhoTyouhoukeiArr[J];
                    wkAnswer.Tyouhoukei2 = KouhoTyouhoukeiArr[K];
                    if (AddAnswer(wkAnswer) == false) continue;

                    Console.Write("解{0}を発見。", ++AnswerCnt);
                    Console.WriteLine("長方形1は{0}*{1}。長方形2は{2}*{3}。正方形の一辺={4}",
                        KouhoTyouhoukeiArr[J].YokoHaba, KouhoTyouhoukeiArr[J].TateHaba,
                        KouhoTyouhoukeiArr[K].YokoHaba, KouhoTyouhoukeiArr[K].TateHaba,
                        wkSeihoukeiHaba);
                }
            }
        }
    }

    //紐の長さを引数として、作成可能な長方形の配列を返す
    static TyouhoukeiInfo[] DeriveKouhoTyouhoukeiArr(int pHimoLen)
    {
        var KouhoTyouhoukeiList = new List<TyouhoukeiInfo>();
        for (int LoopYokoHaba = 1; LoopYokoHaba * 2 <= pHimoLen; LoopYokoHaba++) {
            int RestLen = pHimoLen - LoopYokoHaba * 2;
            if (RestLen % 2 > 0) continue;
            if (RestLen == 0) continue;
            int wkTateHaba = RestLen / 2;

            //長方形の横幅 <= 長方形の縦幅とする 
            if (LoopYokoHaba > wkTateHaba) continue;

            KouhoTyouhoukeiList.Add(
                new TyouhoukeiInfo() { YokoHaba = LoopYokoHaba, TateHaba = wkTateHaba });
        }
        return KouhoTyouhoukeiList.ToArray();
    }

    //既存解の整数倍でなければ、解を追加
    static bool AddAnswer(AnswerDef pAnswer)
    {
        foreach (AnswerDef EachAnswer in AnswerList) {
            if (pAnswer.SeihoukeiHaba % EachAnswer.SeihoukeiHaba > 0)
                continue;
            int Ratio = pAnswer.SeihoukeiHaba / EachAnswer.SeihoukeiHaba;

            if (EachAnswer.Tyouhoukei1.TateHaba * Ratio == pAnswer.Tyouhoukei1.TateHaba
             && EachAnswer.Tyouhoukei1.YokoHaba * Ratio == pAnswer.Tyouhoukei1.YokoHaba
             && EachAnswer.Tyouhoukei2.TateHaba * Ratio == pAnswer.Tyouhoukei2.TateHaba
             && EachAnswer.Tyouhoukei2.YokoHaba * Ratio == pAnswer.Tyouhoukei2.YokoHaba) {
                return false;
            }
        }
        AnswerList.Add(pAnswer);
        return true;
    }
}


実行結果

解1を発見。長方形1は1*9。長方形2は2*8。正方形の一辺=5
解2を発見。長方形1は1*25。長方形2は8*18。正方形の一辺=13
解3を発見。長方形1は2*32。長方形2は9*25。正方形の一辺=17
解4を発見。長方形1は1*49。長方形2は18*32。正方形の一辺=25
解5を発見。長方形1は8*50。長方形2は9*49。正方形の一辺=29
解6を発見。長方形1は2*72。長方形2は25*49。正方形の一辺=37
解7を発見。長方形1は1*81。長方形2は32*50。正方形の一辺=41
解8を発見。長方形1は8*98。長方形2は25*81。正方形の一辺=53
解9を発見。長方形1は1*121。長方形2は50*72。正方形の一辺=61
解10を発見。長方形1は2*128。長方形2は49*81。正方形の一辺=65
解11を発見。長方形1は9*121。長方形2は32*98。正方形の一辺=65
解12を発見。長方形1は18*128。長方形2は25*121。正方形の一辺=73
解13を発見。長方形1は1*169。長方形2は72*98。正方形の一辺=85
解14を発見。長方形1は8*162。長方形2は49*121。正方形の一辺=85
解15を発見。長方形1は9*169。長方形2は50*128。正方形の一辺=89
解16を発見。長方形1は25*169。長方形2は32*162。正方形の一辺=97
解17を発見。長方形1は2*200。長方形2は81*121。正方形の一辺=101
解18を発見。長方形1は18*200。長方形2は49*169。正方形の一辺=109
解19を発見。長方形1は1*225。長方形2は98*128。正方形の一辺=113
解20を発見。長方形1は8*242。長方形2は81*169。正方形の一辺=125


解説

紐の長さごとに、作成可能な長方形を列挙してます。