結果
問題 | No.585 工夫のないパズル |
ユーザー | くれちー |
提出日時 | 2017-10-29 01:27:50 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
AC
|
実行時間 | 40 ms / 2,000 ms |
コード長 | 13,305 bytes |
コンパイル時間 | 1,338 ms |
コンパイル使用メモリ | 118,784 KB |
実行使用メモリ | 19,840 KB |
最終ジャッジ日時 | 2024-11-22 04:31:53 |
合計ジャッジ時間 | 2,701 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 39 ms
19,328 KB |
testcase_01 | AC | 39 ms
19,712 KB |
testcase_02 | AC | 39 ms
19,584 KB |
testcase_03 | AC | 39 ms
19,712 KB |
testcase_04 | AC | 39 ms
19,712 KB |
testcase_05 | AC | 39 ms
19,712 KB |
testcase_06 | AC | 39 ms
19,584 KB |
testcase_07 | AC | 38 ms
19,840 KB |
testcase_08 | AC | 39 ms
19,712 KB |
testcase_09 | AC | 39 ms
19,584 KB |
testcase_10 | AC | 39 ms
19,712 KB |
testcase_11 | AC | 40 ms
19,712 KB |
testcase_12 | AC | 39 ms
19,712 KB |
testcase_13 | AC | 39 ms
19,840 KB |
testcase_14 | AC | 39 ms
19,712 KB |
コンパイルメッセージ
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.IO; using System.Linq; using System.Numerics; using System.Text; using static System.Math; using static System.Linq.Enumerable; using static Extentions; public static class Program { static int[][] _s; static Queue<(Ope, int, int)> _q = new Queue<(Ope, int, int)>(100); enum Ope { R, C } public static void Solve(IO io) { _s = io.Read(4, t => t.Select(u => u - 'A').Take(4).ToArray()); Print(); for (var i = 0; i < 3; i++) for (var j = 0; j < 4; j++) { var (r, c) = Find(i * 4 + j); Move(r, c, i, j); } Print(); for (var i = 0; i < 3; i++) for (var j = 0; j < 4; j++) Assert(_s[i][j] == i * 4 + j); for (var i = 0; i < 4; i++) { var (_, c) = Find(12 + i); while (c > i) { Swap(3, c - 1); (_, c) = Find(12 + i); } } Print(); for (var i = 0; i < 4; i++) for (var j = 0; j < 4; j++) Assert(_s[i][j] == i * 4 + j); Assert(_q.Count <= 100); io.WriteLine(_q.Count); foreach (var (d, i, n) in _q) io.WriteLine($"{d} {i} {n}"); } // for debug static void Print() { for (var i = 0; i < 4; i++) { for (var j = 0; j < 4; j++) Console.Error.Write($"{_s[i][j]:00} "); Console.Error.WriteLine(); } } static (int, int) Find(int v) { for (var i = 0; i < 4; i++) for (var j = 0; j < 4; j++) if (_s[i][j] == v) return (i, j); throw new UnreachableException(); } static int Round(int i) => (i % 4 + 4) % 4; static void Right(int r, int n) { if (n == 0) return; void Right() { var t = _s[r][3]; _s[r][3] = _s[r][2]; _s[r][2] = _s[r][1]; _s[r][1] = _s[r][0]; _s[r][0] = t; } Repeat(Right, n); _q.Enqueue((Ope.R, r, n)); } static void Down(int c, int n) { if (n == 0) return; void Down() { var t = _s[3][c]; _s[3][c] = _s[2][c]; _s[2][c] = _s[1][c]; _s[1][c] = _s[0][c]; _s[0][c] = t; } Repeat(Down, n); _q.Enqueue((Ope.C, c, n)); } static void Move(int sr, int sc, int tr, int tc) { void Move0() { Down(tc, sr - tr); Right(sr, Round(tc - sc)); Down(tc, 4 - (sr - tr)); } void Move1() { Down(sc, 1); Down(tc, 1); Right(sr + 1, Round(tc - sc)); Down(sc, 3); Down(tc, 3); } void Move2() { Right(sr, 1); sc++; Move0(); } if (sr == tr) Move1(); else if (sc == tc) Move2(); else Move0(); } static void Swap(int r, int c) { c = Round(c + 2); Down(c, 1); Right(r, 1); Down(c, 3); Right(r, 2); Down(c, 1); Right(r, 1); Down(c, 3); Right(r, 1); } public static void Main() { Console.SetOut(new StreamWriter(Console.OpenStandardOutput()) { NewLine = "\n", #if DEBUG AutoFlush = true, #else AutoFlush = false, #endif }); Solve(new IO(Console.In, Console.Out)); Console.Out.Flush(); } } public static partial class Extentions { } #region Library // fuckin' slow public class IO { public delegate T Parser<out T>(string str); public delegate string Serializer<in T>(T value); private TextReader _tr; private TextWriter _tw; public IO(TextReader tr, TextWriter tw) { _tr = tr; _tw = tw; } public string ReadLine() => _tr.ReadLine(); private string ReadWord() { var sb = new StringBuilder(); Repeat(_tr.Read).TakeWhile(c => c != ' ' && c != '\n').ForEach(c => sb.Append((char)c)); return sb.ToString(); } public T Read<T>(Parser<T> parser = null) => parser != null ? parser(ReadWord()) : (T)Convert.ChangeType(ReadWord(), typeof(T)); public (T1, T2) Read<T1, T2>( Parser<T1> parser1 = null, Parser<T2> parser2 = null) => (Read(parser1), Read(parser2)); public (T1, T2, T3) Read<T1, T2, T3>( Parser<T1> parser1 = null, Parser<T2> parser2 = null, Parser<T3> parser3 = null) => (Read(parser1), Read(parser2), Read(parser3)); public (T1, T2, T3, T4) Read<T1, T2, T3, T4>( Parser<T1> parser1 = null, Parser<T2> parser2 = null, Parser<T3> parser3 = null, Parser<T4> parser4 = null) => (Read(parser1), Read(parser2), Read(parser3), Read(parser4)); public T[] Read<T>(int count, Parser<T> parser = null) => Repeat(() => Read(parser), count).ToArray(); public (T1[], T2[]) Read<T1, T2>(int count, Parser<T1> parser1 = null, Parser<T2> parser2 = null) => Repeat(() => Read(parser1, parser2), count).ToArray().Unzip(); public (T1[], T2[], T3[]) Read<T1, T2, T3>(int count, Parser<T1> parser1 = null, Parser<T2> parser2 = null, Parser<T3> parser3 = null) => Repeat(() => Read(parser1, parser2, parser3), count).ToArray().Unzip(); public (T1[], T2[], T3[], T4[]) Read<T1, T2, T3, T4>(int count, Parser<T1> parser1 = null, Parser<T2> parser2 = null, Parser<T3> parser3 = null, Parser<T4> parser4 = null) => Repeat(() => Read(parser1, parser2, parser3, parser4), count).ToArray().Unzip(); public void Write<T>(T value, Serializer<T> serializer = null) { _tw.Write(serializer != null ? serializer(value) : value.ToString()); _tw.Write(' '); } public void Write<T1, T2>(T1 value1, T2 value2, Serializer<T1> serializer1 = null, Serializer<T2> serializer2 = null) { Write(value1, serializer1); Write(value2, serializer2); } public void Write<T1, T2, T3>(T1 value1, T2 value2, T3 value3, Serializer<T1> serializer1 = null, Serializer<T2> serializer2 = null, Serializer<T3> serializer3 = null) { Write(value1, serializer1); Write(value2, serializer2); Write(value3, serializer3); } public void Write<T1, T2, T3, T4>(T1 value1, T2 value2, T3 value3, T4 value4, Serializer<T1> serializer1 = null, Serializer<T2> serializer2 = null, Serializer<T3> serializer3 = null, Serializer<T4> serializer4 = null) { Write(value1, serializer1); Write(value2, serializer2); Write(value3, serializer3); Write(value4, serializer4); } public void WriteLine<T>(T value, Serializer<T> serializer = null) { Write(value, serializer); _tw.WriteLine(); } public void WriteLine<T1, T2>(T1 value1, T2 value2, Serializer<T1> serializer1 = null, Serializer<T2> serializer2 = null) { Write(value1, value2, serializer1, serializer2); _tw.WriteLine(); } public void WriteLine<T1, T2, T3>(T1 value1, T2 value2, T3 value3, Serializer<T1> serializer1 = null, Serializer<T2> serializer2 = null, Serializer<T3> serializer3 = null) { Write(value1, value2, value3, serializer1, serializer2, serializer3); _tw.WriteLine(); } public void WriteLine<T1, T2, T3, T4>(T1 value1, T2 value2, T3 value3, T4 value4, Serializer<T1> serializer1 = null, Serializer<T2> serializer2 = null, Serializer<T3> serializer3 = null, Serializer<T4> serializer4 = null) { Write(value1, value2, value3, value4, serializer1, serializer2, serializer3, serializer4); _tw.WriteLine(); } public void WriteLine<T>(IEnumerable<T> values, Serializer<T> serializer = null) => values.ForEach(v => WriteLine(v, serializer)); public void WriteLine<T1, T2>( IEnumerable<T1> values1, IEnumerable<T2> values2, Serializer<T1> serializer1 = null, Serializer<T2> serializer2 = null) { foreach (var (v1, v2) in values1.Zip(values2, ValueTuple.Create)) WriteLine(v1, v2, serializer1, serializer2); } public void WriteLine<T1, T2, T3>( IEnumerable<T1> values1, IEnumerable<T2> values2, IEnumerable<T3> values3, Serializer<T1> serializer1 = null, Serializer<T2> serializer2 = null, Serializer<T3> serializer3 = null) { foreach (var (v1, v2, v3) in values1.Zip(values2, values3, ValueTuple.Create)) WriteLine(v1, v2, v3, serializer1, serializer2, serializer3); } public void WriteLine<T1, T2, T3, T4>( IEnumerable<T1> values1, IEnumerable<T2> values2, IEnumerable<T3> values3, IEnumerable<T4> values4, Serializer<T1> serializer1 = null, Serializer<T2> serializer2 = null, Serializer<T3> serializer3 = null, Serializer<T4> serializer4 = null) { foreach (var (v1, v2, v3, v4) in values1.Zip(values2, values3, values4, ValueTuple.Create)) WriteLine(v1, v2, v3, v4, serializer1, serializer2, serializer3, serializer4); } } public class UnreachableException : Exception { } public static partial class Extentions { public static void Assert(bool condition) { if (!condition) throw new Exception(); } public static string AsString(this IEnumerable<char> source) => new string(source.ToArray()); public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) { foreach (var item in source) action(item); } public static void ForEach<T, _>(this IEnumerable<T> source, Func<T, _> func) { foreach (var item in source) func(item); } public static void ForEach<T>(this IEnumerable<T> source, Action<T, int> action) { var i = 0; foreach (var item in source) action(item, i++); } public static void ForEach<T, _>(this IEnumerable<T> source, Func<T, int, _> func) { var i = 0; foreach (var item in source) func(item, i++); } public static void Repeat(Action action, int count) { for (var i = 0; i < count; i++) action(); } public static void Repeat(Action<int> action, int count) { for (var i = 0; i < count; i++) action(i); } public static IEnumerable<T> Repeat<T>(Func<T> func) { for (var i = 0; ; i++) yield return func(); } public static IEnumerable<T> Repeat<T>(Func<T> func, int count) { for (var i = 0; i < count; i++) yield return func(); } public static IEnumerable<T> Repeat<T>(Func<int, T> func) { for (var i = 0; ; i++) yield return func(i); } public static IEnumerable<T> Repeat<T>(Func<int, T> func, int count) { for (var i = 0; i < count; i++) yield return func(i); } public static void Swap<T>(ref T x, ref T y) { var tmp = x; x = y; y = tmp; } public static (T1[], T2[]) Unzip<T1, T2>( this ICollection<(T1, T2)> source) { var ts1 = new T1[source.Count]; var ts2 = new T2[source.Count]; var i = 0; foreach (var (t1, t2) in source) { ts1[i] = t1; ts2[i] = t2; i++; } return (ts1, ts2); } public static (T1[], T2[], T3[]) Unzip<T1, T2, T3>( this ICollection<(T1, T2, T3)> source) { var ts1 = new T1[source.Count]; var ts2 = new T2[source.Count]; var ts3 = new T3[source.Count]; var i = 0; foreach (var (t1, t2, t3) in source) { ts1[i] = t1; ts2[i] = t2; ts3[i] = t3; i++; } return (ts1, ts2, ts3); } public static (T1[], T2[], T3[], T4[]) Unzip<T1, T2, T3, T4>( this ICollection<(T1, T2, T3, T4)> source) { var ts1 = new T1[source.Count]; var ts2 = new T2[source.Count]; var ts3 = new T3[source.Count]; var ts4 = new T4[source.Count]; var i = 0; foreach (var (t1, t2, t3, t4) in source) { ts1[i] = t1; ts2[i] = t2; ts3[i] = t3; ts4[i] = t4; i++; } return (ts1, ts2, ts3, ts4); } public static IEnumerable<T> Zip<T1, T2, T3, T>( this IEnumerable<T1> first, IEnumerable<T2> second, IEnumerable<T3> thrid, Func<T1, T2, T3, T> resultSelector) { using (var e1 = first.GetEnumerator()) using (var e2 = second.GetEnumerator()) using (var e3 = thrid.GetEnumerator()) { while (e1.MoveNext() && e2.MoveNext() && e3.MoveNext()) yield return resultSelector(e1.Current, e2.Current, e3.Current); } } public static IEnumerable<T> Zip<T1, T2, T3, T4, T>( this IEnumerable<T1> first, IEnumerable<T2> second, IEnumerable<T3> thrid, IEnumerable<T4> fourth, Func<T1, T2, T3, T4, T> resultSelector) { using (var e1 = first.GetEnumerator()) using (var e2 = second.GetEnumerator()) using (var e3 = thrid.GetEnumerator()) using (var e4 = fourth.GetEnumerator()) { while (e1.MoveNext() && e2.MoveNext() && e3.MoveNext() && e4.MoveNext()) yield return resultSelector(e1.Current, e2.Current, e3.Current, e4.Current); } } } #endregion