坑:
又是一种可以搞死面向案例编程的选手的恶心案例,仗着数组是自己隐藏的,自己是知道答案的,于是就假装问几下然后就输出答案。这题别看样例!光这几个问答根本确定不了排列。

思路:
通过一定能找出的位置,如果那么,如果,那么

找到之后就可以通过来得到的值。

MyCode:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e4+7;
int a[maxn];
int main() {
    int t,n,num;
    scanf("%d",&t);
    while(t--) {
        scanf("%d",&n);
        int pos=n;
        for(int i=1;i<n;i+=2) {
            printf("? %d %d %d %d\n",2,i,i+1,1);
            fflush(stdout);
            scanf("%d",&num);
            if(num==1) {
                pos=i; break;
            }
            else if(num==2) {
                printf("? %d %d %d %d\n",2,i+1,i,1);
                fflush(stdout);
                scanf("%d",&num);
                if(num==1) {
                    pos=i+1; break;
                }
            }
        }
        for(int i=1;i<=n;++i) {
            if(i==pos) continue;
            printf("? %d %d %d %d\n",1,pos,i,n-1);
            fflush(stdout);
            scanf("%d",&num);
            a[i]=num;
        }
        a[pos]=1;
        putchar('!');
        for(int i=1;i<=n;++i) printf(" %d",a[i]);
        putchar('\n');
        fflush(stdout);
    }
    return 0;
}