結果
| 問題 | No.228 ゆきこちゃんの 15 パズル | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2020-04-04 12:50:50 | 
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 3 ms / 5,000 ms | 
| コード長 | 1,966 bytes | 
| コンパイル時間 | 1,611 ms | 
| コンパイル使用メモリ | 171,928 KB | 
| 実行使用メモリ | 5,376 KB | 
| 最終ジャッジ日時 | 2024-07-03 07:13:11 | 
| 合計ジャッジ時間 | 2,516 ms | 
| ジャッジサーバーID (参考情報) | judge5 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 17 | 
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define llong long long
int main() {
    vector<vector<int>> puzzle(4, vector<int>(4));
    pair<int, int> zero;
    rep(i, 4) {
        rep(j, 4) {
            int a;
            cin >> a;
            puzzle[i][j] = a;
            if(a == 0) zero = make_pair(i, j);
        }
    }
    bool moving = true;
    while(moving && !(zero.first == 3 && zero.second == 3)) {
        int next_val = zero.first * 4 + zero.second + 1;
        //left, right, top, bottom
        bool left = zero.second > 0 && puzzle[zero.first][zero.second-1] == next_val;
        bool right = zero.second < 3 && puzzle[zero.first][zero.second+1] == next_val;
        bool top = zero.first > 0 && puzzle[zero.first-1][zero.second] == next_val;
        bool bottom = zero.first < 3 && puzzle[zero.first+1][zero.second] == next_val;
        if(left || right || top || bottom) {
            if(left) {
                swap(puzzle[zero.first][zero.second-1], puzzle[zero.first][zero.second]);
                zero.second -= 1;
            } else if(right) {
                swap(puzzle[zero.first][zero.second+1], puzzle[zero.first][zero.second]);
                zero.second += 1;
            } else if(top) {
                swap(puzzle[zero.first-1][zero.second], puzzle[zero.first][zero.second]);
                zero.first -= 1;
            } else if(bottom) {
                swap(puzzle[zero.first+1][zero.second], puzzle[zero.first][zero.second]);
                zero.first += 1;
            }
        } else {
            moving = false;
        }
    }
    bool ok = true;
    rep(i, 4) {
        rep(j, 4) {
            if(i == 3 && j == 3) {
                ok &= puzzle[i][j] == 0;
            } else {
                ok &= (puzzle[i][j] == i*4 + j + 1);
            }
        }
    }
    if(ok) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }
}
            
            
            
        