結果
問題 | No.428 小数から逃げる夢 |
ユーザー | aketijyuuzou |
提出日時 | 2024-10-10 23:56:16 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 5,654 bytes |
コンパイル時間 | 1,239 ms |
コンパイル使用メモリ | 117,092 KB |
実行使用メモリ | 26,928 KB |
最終ジャッジ日時 | 2024-10-10 23:56:23 |
合計ジャッジ時間 | 6,838 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | RE | - |
testcase_01 | RE | - |
testcase_02 | RE | - |
testcase_03 | RE | - |
testcase_04 | RE | - |
testcase_05 | RE | - |
testcase_06 | RE | - |
testcase_07 | RE | - |
testcase_08 | RE | - |
testcase_09 | RE | - |
testcase_10 | RE | - |
testcase_11 | RE | - |
testcase_12 | RE | - |
testcase_13 | RE | - |
testcase_14 | RE | - |
testcase_15 | RE | - |
testcase_16 | RE | - |
testcase_17 | RE | - |
testcase_18 | RE | - |
testcase_19 | RE | - |
testcase_20 | RE | - |
testcase_21 | RE | - |
testcase_22 | RE | - |
testcase_23 | RE | - |
testcase_24 | RE | - |
testcase_25 | RE | - |
testcase_26 | RE | - |
testcase_27 | RE | - |
testcase_28 | RE | - |
testcase_29 | RE | - |
testcase_30 | RE | - |
testcase_31 | RE | - |
testcase_32 | RE | - |
testcase_33 | RE | - |
testcase_34 | RE | - |
testcase_35 | RE | - |
testcase_36 | RE | - |
testcase_37 | RE | - |
testcase_38 | RE | - |
testcase_39 | RE | - |
testcase_40 | RE | - |
testcase_41 | RE | - |
testcase_42 | RE | - |
testcase_43 | RE | - |
testcase_44 | RE | - |
testcase_45 | RE | - |
testcase_46 | RE | - |
testcase_47 | RE | - |
testcase_48 | RE | - |
testcase_49 | RE | - |
testcase_50 | RE | - |
testcase_51 | RE | - |
testcase_52 | RE | - |
testcase_53 | RE | - |
testcase_54 | RE | - |
testcase_55 | RE | - |
testcase_56 | RE | - |
testcase_57 | RE | - |
testcase_58 | RE | - |
testcase_59 | RE | - |
testcase_60 | RE | - |
testcase_61 | RE | - |
testcase_62 | RE | - |
testcase_63 | RE | - |
testcase_64 | RE | - |
testcase_65 | RE | - |
testcase_66 | RE | - |
testcase_67 | RE | - |
testcase_68 | RE | - |
testcase_69 | RE | - |
testcase_70 | RE | - |
testcase_71 | RE | - |
testcase_72 | RE | - |
testcase_73 | RE | - |
testcase_74 | RE | - |
testcase_75 | RE | - |
testcase_76 | RE | - |
testcase_77 | RE | - |
testcase_78 | RE | - |
testcase_79 | RE | - |
testcase_80 | RE | - |
testcase_81 | RE | - |
testcase_82 | RE | - |
testcase_83 | RE | - |
testcase_84 | RE | - |
testcase_85 | RE | - |
testcase_86 | RE | - |
testcase_87 | RE | - |
testcase_88 | RE | - |
testcase_89 | RE | - |
testcase_90 | RE | - |
testcase_91 | RE | - |
testcase_92 | RE | - |
testcase_93 | RE | - |
testcase_94 | RE | - |
testcase_95 | RE | - |
testcase_96 | RE | - |
testcase_97 | RE | - |
testcase_98 | RE | - |
testcase_99 | RE | - |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System; using System.Collections.Generic; using System.Linq; class Program { static string InputPattern = "InputX"; static List<string> GetInputList() { var WillReturn = new List<string>(); if (InputPattern == "Input1") { WillReturn.Add("1 2 3 4"); WillReturn.Add("5 6 7 8"); WillReturn.Add("9 10 11 12"); WillReturn.Add("13 14 15 0"); //Yes //初期配置がそのまま目標の配置である。 } else if (InputPattern == "Input2") { WillReturn.Add("1 2 3 4"); WillReturn.Add("5 6 7 8"); WillReturn.Add("9 10 12 0"); WillReturn.Add("13 14 11 15"); //Yes } else if (InputPattern == "Input3") { WillReturn.Add("1 2 3 4"); WillReturn.Add("5 6 7 8"); WillReturn.Add("9 10 12 15"); WillReturn.Add("13 14 11 0"); //No //目標の配置を作るためには、15の駒を最低2回はスライドしなければならない。 } else { string wkStr; while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr); } return WillReturn; } const int UB = 4 - 1; static void Main() { List<string> InputList = GetInputList(); int[,] BanArr = new int[UB + 1, UB + 1]; for (int Y = 0; Y <= UB; Y++) { int[] wkArr = InputList[Y].Split(' ').Select(X => int.Parse(X)).ToArray(); for (int X = 0; X <= UB; X++) { BanArr[X, Y] = wkArr[X]; } } Console.WriteLine(HasAnswer(BanArr) ? "Yes" : "No"); } struct JyoutaiDef { internal int[,] BanArr; internal HashSet<int> MovedNumSet; } //深さ優先探索で解を探す static bool HasAnswer(int[,] pBanArr) { //正位置とのマンハッタン距離が2以上の数値があったらNo for (int LoopX = 0; LoopX <= UB; LoopX++) { for (int LoopY = 0; LoopY <= UB; LoopY++) { if (pBanArr[LoopX, LoopY] == 0) continue; if (DeriveKyori(pBanArr[LoopX, LoopY], LoopX, LoopY) >= 2) return false; } } var stk = new Stack<JyoutaiDef>(); JyoutaiDef WillPush; WillPush.BanArr = pBanArr; WillPush.MovedNumSet = new HashSet<int>(); stk.Push(WillPush); while (stk.Count > 0) { JyoutaiDef Popped = stk.Pop(); //PrintBan(Popped.BanArr); //クリア判定 if (IsClear(Popped.BanArr)) return true; int ZeroX, ZeroY; Derive0Zahyou(Popped.BanArr, out ZeroX, out ZeroY); Action<int, int> PushSyori = (pFromX, pFromY) => { if (pFromX < 0 || UB < pFromX) return; if (pFromY < 0 || UB < pFromY) return; //1度移動した数値は移動不可 if (Popped.MovedNumSet.Contains(pBanArr[pFromX, pFromY])) return; //正位置とのマンハッタン距離が1の数値のみ移動可 if (DeriveKyori(pBanArr[pFromX, pFromY], pFromX, pFromY) != 1) return; WillPush.BanArr = (int[,])Popped.BanArr.Clone(); int SankakuWK = WillPush.BanArr[pFromX, pFromY]; WillPush.BanArr[pFromX, pFromY] = 0; WillPush.BanArr[ZeroX, ZeroY] = SankakuWK; WillPush.MovedNumSet = new HashSet<int>(Popped.MovedNumSet) { SankakuWK }; stk.Push(WillPush); }; PushSyori(ZeroX, ZeroY - 1); PushSyori(ZeroX, ZeroY + 1); PushSyori(ZeroX - 1, ZeroY); PushSyori(ZeroX + 1, ZeroY); } return false; } //数値の現座標を引数として、正位置とのマンハッタン距離を求める static int DeriveKyori(int pCurrNum, int pX, int pY) { int NeedNum = 1; for (int LoopY = 0; LoopY <= UB; LoopY++) { for (int LoopX = 0; LoopX <= UB; LoopX++) { if (pCurrNum == NeedNum++) { return Math.Abs(LoopX - pX) + Math.Abs(LoopY - pY); } } } return -1; } //盤面の0の座標を返す static void Derive0Zahyou(int[,] pBanArr, out int pX, out int pY) { pX = pY = -1; for (int LoopX = 0; LoopX <= UB; LoopX++) { for (int LoopY = 0; LoopY <= UB; LoopY++) { if (pBanArr[LoopX, LoopY] != 0) continue; pX = LoopX; pY = LoopY; return; } } } //クリア判定 static bool IsClear(int[,] pBanArr) { int NeedNum = 1; for (int LoopY = 0; LoopY <= UB; LoopY++) { for (int LoopX = 0; LoopX <= UB; LoopX++) { if (LoopX == UB && LoopY == UB) { if (pBanArr[LoopX, LoopY] != 0) return false; } else if (pBanArr[LoopX, LoopY] != NeedNum++) return false; } } return true; } //盤面を表示 static void PrintBan(int[,] pBanArr) { Console.WriteLine(new string('■', 8)); for (int LoopY = 0; LoopY <= UB; LoopY++) { for (int LoopX = 0; LoopX <= UB; LoopX++) { Console.Write("{0,2},", pBanArr[LoopX, LoopY]); } Console.WriteLine(); } } }