トップページに戻る    次のC#のサンプルへ    前のC#のサンプルへ

Problem28 対角線上の数字の合計

問題

1から初めて右方向に進み時計回りに数字を増やしていき,
5×5の螺旋が以下のように生成される:

21 22 23 24 25
20  7  8  9 10
19  6  1  2 11
18  5  4  3 12
17 16 15 14 13

両対角線上の数字の合計は101であることが確かめられる.

1001×1001の螺旋を同じ方法で生成したとき, 対角線上の数字の合計はいくつだろうか?


ソース

using System;

class Program
{
    //const int Haba = 5;
    const int Haba = 1001;

    static void Main()
    {
        int[,] BanArr = new int[Haba, Haba];
        int X, Y;
        int UB = BanArr.GetUpperBound(0);
        X = Y = UB / 2;

        int MoveX, MoveY;
        MoveX = MoveY = 1;
        int NextMove = 2;

        int SetVal = 1;
        BanArr[X, Y] = SetVal;

        while (true) {
            if (MoveX > 0) {
                if (++X > UB) break;
                --MoveX;
                BanArr[X, Y] = ++SetVal;
                continue;
            }
            else if (MoveX < 0) {
                if (--X < 0) break;
                ++MoveX;
                BanArr[X, Y] = ++SetVal;
                continue;
            }
            else if (MoveY > 0) {
                if (++Y > UB) break;
                --MoveY;
                BanArr[X, Y] = ++SetVal;
                continue;
            }
            else if (MoveY < 0) {
                if (--Y < 0) break;
                ++MoveY;
                BanArr[X, Y] = ++SetVal;
                continue;
            }
            if (NextMove % 2 == 0) {
                MoveX = MoveY = -NextMove++;
            }
            else {
                MoveX = MoveY = NextMove++;
            }
        }

        if (Haba == 5) {
            for (int I = 0; I <= UB; I++) {
                for (int J = 0; J <= UB; J++) {
                    Console.Write("{0,8},", BanArr[J, I]);
                }
                Console.WriteLine();
            }
        }

        long SumVal = 0;
        for (int I = 0; I <= UB; I++) {
            SumVal += BanArr[I, I];
            if (I != UB / 2)
                SumVal += BanArr[UB - I, I];
        }
        Console.WriteLine("合計={0}", SumVal);
    }
}


実行結果

省略
合計=669171001


解説

走査して配列を埋めてます。