長さ1の棒、2の棒、・・・、Nの棒を順につなげて輪を作る。 長さNの棒と1の棒もつなげるワケだ。 つなぎ目を曲げるか伸ばすかは自由にできるが、棒の途中では曲げられない。 N=9の時にはFig.1のように、正三角形を作ることができる。 これを「長さ9、9から3、4から6、7から8」と表す事にする。 さて、N=1から1000の範囲で、このような正三角形の組をすべて見つけてほしい。 ひとつのNで複数組の三角形ができる可能性もお忘れなく。 Fig.1 トライアングル (N=9のとき)![]()
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
int AnswerCnt = 0;
for (int N = 1; N <= 1000; N++) {
//和が3の倍数でない場合は対象外
int SumHenLength = (N * (N + 1)) / 2;
if (SumHenLength % 3 != 0) continue;
//チェック済の正三角形の始点のSet
var ShitenSet = new HashSet<int>();
//正三角形の始点のループ
for (int Shiten = 1; Shiten <= N; Shiten++) {
bool WillContinue = false;
var AnswerLengthList = new List<int>();
int CurrHenLength = 0;
Action<int> EachLengthSyori = (pEachLength) =>
{
if (CurrHenLength == 0) {
if (ShitenSet.Add(pEachLength) == false) {
WillContinue = true; return;
}
AnswerLengthList.Add(pEachLength);
}
CurrHenLength += pEachLength;
if (CurrHenLength == SumHenLength / 3) {
AnswerLengthList.Add(pEachLength);
CurrHenLength = 0;
}
else if (CurrHenLength > SumHenLength / 3) {
WillContinue = true;
}
};
for (int I = Shiten; I <= N; I++) {
EachLengthSyori(I);
if (WillContinue) break;
}
if (WillContinue) continue;
for (int I = 1; I < Shiten; I++) {
EachLengthSyori(I);
if (WillContinue) break;
}
if (WillContinue) continue;
if (AnswerLengthList.Count == 6) {
Console.WriteLine("解{0}", ++AnswerCnt);
Console.Write("長さ{0},", N);
for (int I = 0; I <= AnswerLengthList.Count - 1; I++) {
if (I % 2 == 0) Console.Write("{0}から", AnswerLengthList[I]);
else Console.Write("{0},", AnswerLengthList[I]);
}
Console.WriteLine();
}
}
}
}
}
解1 長さ9,4から6,7から8,9から3, 解2 長さ90,16から54,55から75,76から15, 解3 長さ125,3から72,73から102,103から2, 解4 長さ125,58から92,93から117,118から57, 解5 長さ153,52から102,103から135,136から51, 解6 長さ189,16から110,111から155,156から15, 解7 長さ440,25から255,256から360,361から24, 解8 長さ819,57から476,477から671,672から56, 解9 長さ989,165から594,595から824,825から164,
チェック済の正三角形の始点をHashSetで管理してます。