ひさしぶりの雪景色にテンションがあがった日曜日

昨日は寝る前にひさしぶりにプログラミングコンテストの練習問題を解きました。

https://atcoder.jp/contests/abc183/tasks/abc183_catcoder.jp

しばらく解いてなかったのは気が向かなかったというのもあるのですが、解きかけてた問題が「解き方は分かるけど書き方が分からない」タイプの問題でしてこれがきれいに解けなくてしばらく悩んでいたからでした。昨日の夕方に走っているときにアイディアがわいてきたのでそれを元にコーディングしたら無事ACでした。

テストを2回通しているのは一回目はとりあえず、で書いたのですが重複したコードがあって気に入らなかったので直したのでした。2回目の方(直した後の方)が遅いのは読みやすくするため+デバッグのためのコードが入ったからでして、「遅くなるように書けばちゃんと遅くなるんだな」とちょっと感心しました。
※ コードは最後に貼って残しておきます

朝起きたら外は一面雪景色。妻は既に仕事に出かけていたのですがどうやら早い時間だともっと雪がすごかったみたいでした。
宇都宮でこんなに雪が降ったのはかなりひさしぶりな気がします。ただ、お昼近くになると雪もだいぶ溶けていて道路には雪が残っていなかったのでお昼は食べに出かけました。


# お昼ご飯

日高屋でレバニラ定食を食べたのですが今日はいまいちでした。

帰りがけに次女の通う高校の近くを通ってきたのですが、道路にはまったく雪がないのに田んぼは一面雪景色でとても清々しい眺めでした。冬だ!

帰宅して次女を置いたら妻を迎えに行ってそのまま買い物まで済ませちゃいました。雪のせいなのか時間帯のせいなのかスーパーもあまり人がいなくて閑散としていました。買い物を終えて帰宅したら妻と次女と3人で投票しに行ってきました。

自宅の目の前が投票所なので薄着+サンダルで出かけたのですが死ぬほど寒かったので油断は禁物です。
今回の選挙に関しては、開催時期や実施に至るまでの経緯もすべて含めて不快感しかないのですが、選挙権を得たばかりの次女と投票に行けたことだけは良かったなと思ってます。

投票し終えたら走りに出かけました。

今日は寒いのもそうですが雪で道路状況が悪過ぎるので軽く走って済ませました。ほんとうは5kmくらいで止めようと思っていたのですが、走りだすと1時間くらいは走りたくなってしまって結局いつもどおりな感じでした。大通り沿いはだいぶ雪もなくなっていましたが、細い道はまだまだでした。

明日の朝までに雪が融けることはなさそうなので、歩いて出社するのがいまから憂鬱です。

今日はいつも以上に選挙特番を見たくないので早めに寝ます。


(差分)
github.com

↓は直した後の(遅くなってる方)のコードですが前よりもだいぶすっきりしています。

using System.Collections.Generic;

namespace _16_Travel {
    internal class Program {

        /// <summary>
        /// 結果
        /// </summary>
        static Dictionary<int, int> _result = new Dictionary<int, int>();

        /// <summary>
        /// 点と点の距離(key:{from}_{to}, value:distance
        /// </summary>
        static Dictionary<string, int> _distances = new Dictionary<string, int>();

        /// <summary>
        /// デバッグモードかどうか
        /// </summary>
        static bool _isDebug = false;

        /// <summary>
        /// C - Travel
        /// </summary>
        /// <remarks>https://atcoder.jp/contests/abc183/tasks/abc183_c</remarks>
        static void Main() {
            var conditions1 = Console.ReadLine()?.Split(' ');
            if (conditions1 == null) return;
            var n = Convert.ToInt32(conditions1[0]);
            var k = Convert.ToInt32(conditions1[1]);

            for (var i = 1; i <= n; i++) {
                var conditions2 = Console.ReadLine()?.Split(' ');
                if (conditions2 == null) return;
                for (var j = 1; j <= n; j++) {
                    _distances.Add($"{i}_{j}", Convert.ToInt32(conditions2[j - 1]));
                }
            }

            var data = new List<int>();
            for (var i = 2; i <= n; i++) data.Add(i);
            ToNextStep(1, 0, data);
            Console.WriteLine(_result.ContainsKey(k) ? _result[k] : 0);
        }

        /// <summary>
        /// 次の処理にうつって距離を計算
        /// </summary>
        /// <param name="current"></param>
        /// <param name="sum"></param>
        /// <param name="data"></param>
        static void ToNextStep(int current, int sum, List<int> data) {
            PrintDebugMessage($"{current} - {sum}");
            if (data.Count == 0) {
                sum += _distances[$"{current}_1"];
                if (_result.ContainsKey(sum)) _result[sum]++;
                else _result[sum] = 1;
                PrintDebugMessage($"合計:{sum}\r\n----------");
            } else {
                foreach (var t in data) {
                    var nextList = new List<int>(data);
                    nextList.Remove(t);

                    var key = $"{current}_{t}";
                    PrintDebugMessage($"_distances[{key}] : {_distances[key]}");
                    ToNextStep(t, sum + _distances[key], nextList);
                }
            }
        }

        static void PrintDebugMessage(string msg) {
            if (_isDebug) Console.WriteLine(msg);
        }
    }
}