結果

問題 No.228 ゆきこちゃんの 15 パズル
ユーザー mban
提出日時 2017-01-12 10:38:03
言語 C#
(mono 4.6.2)
結果
WA  
実行時間 -
コード長 3194 Byte
コンパイル時間 307 ms
使用メモリ 18700 KB

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
challenge01.txt WA -
sample01.txt AC 28 ms
14604 KB
sample02.txt AC 29 ms
16644 KB
sample03.txt AC 28 ms
16648 KB
test01.txt AC 26 ms
14616 KB
test02.txt AC 28 ms
16644 KB
test03.txt AC 28 ms
14604 KB
test04.txt AC 27 ms
14604 KB
test05.txt AC 28 ms
16656 KB
test06.txt AC 27 ms
14600 KB
test07.txt AC 28 ms
14604 KB
test08.txt AC 28 ms
16656 KB
test09.txt AC 28 ms
16644 KB
test10.txt AC 28 ms
18700 KB
test11.txt AC 27 ms
16644 KB
test12.txt AC 27 ms
16652 KB
test13.txt AC 27 ms
18688 KB
test14.txt AC 28 ms
16644 KB
test15.txt AC 27 ms
16648 KB
test16.txt AC 27 ms
16648 KB
テストケース一括ダウンロード

ソースコード

diff #
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Text.RegularExpressions;
using System.Linq;
using System.IO;

class Program
{
    static private Magatro M = new Magatro();
    static private void Main(string[]args)
    {
        M.Scan();
        M.Solve();
    }
}

public class Scanner
{
    private string[] S;
    private int Index;
    private char Separator;

    public Scanner(char separator = ' ')
    {
        Index = 0;
        Separator = separator;
    }

    private string[] Line()
    {
        return Console.ReadLine().Split(Separator);
    }

    public string Next()
    {
        string result;
        if (S == null || Index >= S.Length)
        {
            S = Line();
            Index = 0;
        }
        result = S[Index];
        Index++;
        return result;
    }
    public int NextInt()
    {
        return int.Parse(Next());
    }
    public double NextDouble()
    {
        return double.Parse(Next());
    }
    public long NextLong()
    {
        return long.Parse(Next());
    }
}

public class Magatro
{
    int[,] a = new int[4, 4];
    int[,] Source = new int[4, 4];
    public void Scan()
    {
        Scanner sc = new Scanner();
        for(int i = 0; i < 4; i++)
        {
            for(int j = 0; j < 4; j++)
            {
                a[i, j] = sc.NextInt();
            }
        }
    }
    private void Start()
    {
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                if (i == 3 && j == 3)
                {
                    Source[i, j] = 0;
                }
                else
                {
                    Source[i, j] = i * 4 + j + 1;
                }
            }
        }
    }
    public void Solve()
    {
        Start();
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                int p = a[i, j];
                if (p != 0)
                {
                    if (p == Source[i, j]) continue;
                    if (i > 0 && p == Source[i - 1, j]) continue;
                    if (j > 0 && p == Source[i, j - 1]) continue;
                    if (i < 3 && p == Source[i + 1, j]) continue;
                    if (j < 3 && p == Source[i, j + 1]) continue;

                    Console.WriteLine("No");
                    return;
                }
            }
        }
        int inversion = 0;
        int zero = 0;
        for(int i = 0; i < 15; i++)
        {
            if (a[i / 4, i % 4] == 0)
            {
                zero = 3 - i / 4;
                continue;
            }
           for(int j = i+1; j < 16; j++)
            {
                if (a[j / 4, j % 4] == 0)
                {
                    continue;
                }
                if (a[i / 4, i % 4] > a[j / 4, j % 4])
                {
                    inversion++;
                }
            }
        }
        if ((inversion + zero) % 2 == 0)
        {
            Console.WriteLine("Yes");
        }
        else
        {
            Console.WriteLine("No");
        }
    }
}
0