「ロジックサマナー」の「魔法陣」


解いてみたので、ソースコードをメモとして残したいなと。
改良したいと思い立った時やら、あとから見直して下手だなと気づくために。

なお、
この問題に挑戦している人にとっては、
ヒントどころか回答そのままなので見るか見ないかは判断を任せます。

mahojin.cs
using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        int N = int.Parse(Console.ReadLine());
        List<List<int>> row = new List<List<int>>();
        for (int i = 0; i < N; i++)
        {
            List<int> column = new List<int>(N);
            string[] input = Console.ReadLine().Split(' ');
            for (int j = 0; j < N; j++)
            {
                column.Add(int.Parse(input[j]));
            }
            row.Add(column);
        }

        //-魔法陣を修復する。
        List<List<int>> result = GetTheRepairedMagicSquare(row);

        //-完成した魔法陣を出力する。
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                Console.Write(result[i][j]);
                if (j != N - 1) { Console.Write(" "); }
            }
            Console.WriteLine();
        }
        Console.ReadLine();
    }
    static List<List<int>> GetTheRepairedMagicSquare(List<List<int>> OriginMagicSquare)
    {
        List<List<int>> RepairedMagicSquare = OriginMagicSquare;

        List<int> filledPositionRow = new List<int>(2);
        List<int> filledPositionColumn = new List<int>(2);
        //-魔法陣の中から0の数字がある座標を取得する。
        for (int i = 0; i < OriginMagicSquare.Count; i++)
        {
            for (int j = 0; j < OriginMagicSquare[i].Count; j++)
            {
                if (OriginMagicSquare[i][j] == 0)
                {
                    //--その座標の行、または列、i,jのどちらかで合計が定和[1+2+3+...N^2/N]になるように、0の数字がある座標を書き換える。
                    RepairedMagicSquare[i][j] = GetFilledNumber(RepairedMagicSquare, i, j);
                }
            }
        }

        return RepairedMagicSquare;
    }
    static int GetFilledNumber(List<List<int>> OriginMagicSquare, int filledPositionRow, int filledPositionColumn)
    {
        int filledNumber = 0;

        int N = OriginMagicSquare.Count;//魔方陣の行数(列数)
        int constantSum = (int)(N * (Math.Pow(N, 2) + 1) / 2);//魔方陣の定和

        int columnSum = 0;
        for (int row = 0; row < N; row++)
        {
            columnSum += OriginMagicSquare[row][filledPositionColumn];
        }
        if (constantSum - columnSum <= N * N)
        {
            for (int i = 0; i < N; i++)
            {
                if (OriginMagicSquare[i].Contains(constantSum - columnSum))
                {
                    int rowSum = GetSumOfRowNumber(OriginMagicSquare, filledPositionRow);
                    filledNumber = constantSum - rowSum;
                    break;
                }
                else { filledNumber = constantSum - columnSum; }
            }
        }
        else
        {
            int rowSum = GetSumOfRowNumber(OriginMagicSquare, filledPositionRow);
            filledNumber = constantSum - rowSum;
        }

        return filledNumber;
    }
    static int GetSumOfRowNumber(List<List<int>> OriginMagicSquare ,int row)//引数2に指定した行riの合計値(ri_c0+ri_c1+ri_c2...ri_cN)を返すメソッド
    {
        int N = OriginMagicSquare.Count;
        int rowSum = 0;

        for(int column = 0;column < N; column++)
        {
            rowSum += OriginMagicSquare[row][column];
        }

        return rowSum;
    }
}

とりあえず動けばいいと思って書くコードからして
読みやすいコードが書けるように早く上達したいものだ。