#include 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; const int dx[8] = {-1, 1, 0, 0, -1, -1, 1, 1}, dy[8] = {0, 0, -1, 1, -1, 1, -1, 1}; vector a; ull target; ull _hash(const vector &v){ ull res = 0; for(int i=0;i<16;++i){ res = (res << 4) + abs(v[i]); } return res; } bool rec(vector 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 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 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; }