結果
問題 | No.228 ゆきこちゃんの 15 パズル |
ユーザー | tottoripaper |
提出日時 | 2018-02-17 21:50:14 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 3 ms / 5,000 ms |
コード長 | 1,450 bytes |
コンパイル時間 | 1,893 ms |
コンパイル使用メモリ | 171,464 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-24 12:20:05 |
合計ジャッジ時間 | 2,794 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,816 KB |
testcase_01 | AC | 2 ms
6,940 KB |
testcase_02 | AC | 2 ms
6,940 KB |
testcase_03 | AC | 2 ms
6,940 KB |
testcase_04 | AC | 2 ms
6,944 KB |
testcase_05 | AC | 2 ms
6,940 KB |
testcase_06 | AC | 2 ms
6,944 KB |
testcase_07 | AC | 2 ms
6,940 KB |
testcase_08 | AC | 2 ms
6,940 KB |
testcase_09 | AC | 2 ms
6,940 KB |
testcase_10 | AC | 3 ms
6,940 KB |
testcase_11 | AC | 2 ms
6,940 KB |
testcase_12 | AC | 2 ms
6,944 KB |
testcase_13 | AC | 2 ms
6,940 KB |
testcase_14 | AC | 2 ms
6,940 KB |
testcase_15 | AC | 2 ms
6,940 KB |
testcase_16 | AC | 2 ms
6,940 KB |
testcase_17 | AC | 2 ms
6,944 KB |
testcase_18 | AC | 3 ms
6,940 KB |
testcase_19 | AC | 2 ms
6,940 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; #define fst(t) std::get<0>(t) #define snd(t) std::get<1>(t) #define thd(t) std::get<2>(t) #define unless(p) if(!(p)) #define until(p) while(!(p)) using ll = long long; using ull = unsigned long long; using P = std::tuple<int,int>; const int dx[8] = {-1, 1, 0, 0, -1, -1, 1, 1}, dy[8] = {0, 0, -1, 1, -1, 1, -1, 1}; vector<int> a; ull target; ull _hash(const vector<int> &v){ ull res = 0; for(int i=0;i<16;++i){ res = (res << 4) + abs(v[i]); } return res; } bool rec(vector<int> v, int x, int y){ if(_hash(v) == target){ return true; } for(int i=0;i<4;++i){ int nx = x + dx[i], ny = y + dy[i]; if(nx < 0 || nx >= 4 || ny < 0 || ny >= 4){ continue; } if(v[ny * 4 + nx] < 0){ continue; } vector<int> w(v); w[ny * 4 + nx] = -w[ny * 4 + nx]; swap(w[y * 4 + x], w[ny * 4 + nx]); if(rec(w, nx, ny)){ return true; } } return false; } int main(){ std::cin.tie(nullptr); std::ios::sync_with_stdio(false); a.resize(16); for(int i=0;i<16;++i){ std::cin >> a[i]; } target = _hash(a); vector<int> v; v.resize(16); iota(v.begin(), v.begin() + 15, 1); v[15] = 0; bool can = rec(v, 3, 3); const string YESNO[2] = {"No", "Yes"}; std::cout << YESNO[can] << std::endl; }