#define _CRT_SECURE_NO_WARNINGS
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
#include <bits/stdc++.h>
using namespace std;
#define CRP(t, x) const t &x
#define OPL(t, x) bool operator<(CRP(t, x)) const
#define FIL(x, v) memset(x, v, sizeof(x))
#define CLR(x) FIL(x, 0)
#define NE1(x) FIL(x, -1)
#define INF(x) FIL(x, 0x3f)
typedef long long ll, i64;
#define is_right tmp.zeo % 4 == 0
#define is_up tmp.zeo >= 1 && tmp.zeo <= 4
#define is_down tmp.zeo >= 13 && tmp.zeo <= 16
#define is_left tmp.zeo % 4 == 1
using namespace std;
struct lst
{
    string s;
    int stp;
    int zeo;
};
char cg[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
map<string, int> mp;
queue<lst> q;
const int um = 15;
int main()
{
    lst be;
    be.s = "x123456789ABCDEF0";
    be.stp = 0;
    be.zeo = 16;
    mp[be.s] = 0;
    int cnt = 0;
    q.push(be);
    while (!q.empty())
    {
        cnt++;
        lst tmp = q.front();
        q.pop();
        if (tmp.stp > mp[tmp.s]) continue;
        bool goup = 1, godown = 1, goleft = 1, goright = 1;
        if (is_right) { goright = 0; }
        if (is_up) { goup = 0; }
        if (is_down) { godown = 0; }
        if (is_left) { goleft = 0; }
        if (goup)
        {
            lst qins = tmp;
            swap(qins.s[qins.zeo], qins.s[qins.zeo - 4]);
            qins.zeo -= 4;
            qins.stp++;
            if (qins.stp <= um && ((!mp.count(qins.s) || mp[qins.s] > qins.stp)))
            {
                q.push(qins);
                mp[qins.s] = qins.stp;
            }
        }
        if (godown)
        {
            lst qins = tmp;
            swap(qins.s[qins.zeo], qins.s[qins.zeo + 4]);
            qins.zeo += 4;
            qins.stp++;
            if (qins.stp <= um && ((!mp.count(qins.s) || mp[qins.s] > qins.stp)))
            {
                q.push(qins);
                mp[qins.s] = qins.stp;
            }
        }
        if (goleft)
        {
            lst qins = tmp;
            swap(qins.s[qins.zeo], qins.s[qins.zeo - 1]);
            qins.zeo -= 1;
            qins.stp++;
            if (qins.stp <= um && ((!mp.count(qins.s) || mp[qins.s] > qins.stp)))
            {
                q.push(qins);
                mp[qins.s] = qins.stp;
            }
        }
        if (goright)
        {
            lst qins = tmp;
            swap(qins.s[qins.zeo], qins.s[qins.zeo + 1]);
            qins.zeo += 1;
            qins.stp++;
            if (qins.stp <= um && ((!mp.count(qins.s) || mp[qins.s] > qins.stp)))
            {
                q.push(qins);
                mp[qins.s] = qins.stp;
            }
        }
    }
    //	cout<<cnt<<endl;
    for (auto x : mp)
    {
        int cnt = 1;
        for (int i = 1; i <= 4; i++, cout << endl)
            for (int j = 1; j <= 4; j++)
            {
                cout << x.first[cnt] << " ";
                cnt++;
            }
        cout << ";;" << x.second << endl;
        getchar();
    }
    int T;
    scanf("%d", &T);
    for (int i = 1; i <= T; i++)
    {
        string mm = "x";
        for (int j = 1; j <= 16; j++)
        {
            int t;
            scanf("%d", &t);
            mm = mm + cg[t];
        } //cout<<mm<<endl;
        if (mp.count(mm))
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}
