CF1896G
//#define DEBUG
#include<bits/stdc++.h>
using namespace std;
int n,N,lim,pepe[30][500],winner;
int x[500],y[500],num[30],x2[500],pos[500];
bool vis[500];
set<int> slow;
void init(int n){
N=n*n;
lim=n*n-n+1;
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)pepe[i][j]=(i-1)*n+j;
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){
int __=(i-1)*n+j;
x2[__]=x[__]=i;
y[__]=j;
}
num[0]=num[n+1]=0;
for(int i=1;i<=n;i++)num[i]=n;
slow.clear();
}
void _move(int a,int to){
int g=x[a],z=y[a];
if(to)x2[a]=to;
x[a]=to;
y[a]=++num[to];
pepe[to][num[to]]=a;
pepe[g][z]=pepe[g][num[g]];
pepe[g][num[g]--]=0;
y[pepe[g][z]]=z;
}
void GOWORK(){
cin>>n;
if(n==1){
cout<<"! 1"<<endl;
return;
}
init(n);
#ifdef DEBUG
for(int i=1;i<=N;i++)cout<<x2[i]<<' '<<x[i]<<" "<<y[i]<<endl;
for(int i=0;i<=n+1;i++){
cout<<i<<"#"<<num[i]<<endl;
for(int j=1;j<=num[i];j++){
cout<<pepe[i][j]<<" ";
}
cout<<endl;
}
#endif
for(int i=1;i<=n;i++){
cout<<"? ";
for(int j=1;j<=n;j++)cout<<pepe[i][j]<<' ';
cout<<endl;
cin>>winner;
_move(winner,0);
pos[winner]=i;
for(int j=1;j<=num[i];j++)slow.insert(pepe[i][j]);
#ifdef DEBUG
for(int i=1;i<=N;i++)cout<<x2[i]<<' '<<x[i]<<" "<<y[i]<<endl;
for(int i=0;i<=n+1;i++){
cout<<i<<"#"<<num[i]<<endl;
for(int j=1;j<=num[i];j++){
cout<<pepe[i][j]<<" ";
}
cout<<endl;
}
#endif
}
while(114514){
cout<<"? ";
for(int i=1;i<=n;i++)cout<<pepe[0][i]<<' ';
cout<<endl;
cin>>winner;
int lastx=pos[winner];
_move(winner,n+1);
if(num[n+1]>=lim)break;
if(num[lastx]==0)winner=*(slow.begin());
else if(num[lastx]==1)winner=pepe[lastx][1];
else{
cout<<"? ";
int cnt=0;
for(int i=1;i<=num[lastx];i++){
cout<<pepe[lastx][i]<<' ';
cnt++;
vis[pepe[lastx][i]]=1;
}
for(int elem:slow){
if(cnt>=n)break;
if(vis[elem])continue;
cout<<elem<<' ';
++cnt;
}
cout<<endl;
cin>>winner;
for(int i=1;i<=num[lastx];i++)vis[pepe[lastx][i]]=0;
}
_move(winner,0);
pos[winner]=lastx;
slow.erase(winner);
#ifdef DEBUG
for(int i=1;i<=N;i++)cout<<x2[i]<<' '<<x[i]<<" "<<y[i]<<endl;
for(int i=0;i<=n+1;i++){
cout<<i<<"#"<<num[i]<<endl;
for(int j=1;j<=num[i];j++){
cout<<pepe[i][j]<<" ";
}
cout<<endl;
}
for(int elem:slow)cout<<elem<<' ';
cout<<endl;
#endif
}
cout<<"! ";
for(int i=1;i<=lim;i++)cout<<pepe[n+1][i]<<' ';
cout<<endl;
}
int main(){
int DAY;
cin>>DAY;
while(DAY--)GOWORK();
return 0;
}
/*
1 3 4 2
7 1 2 8 9 3 4 5 6
*/
前两个点过了,第三个点为什么会ildeness limit exceeded