能帮忙看看为什么显示格式出错就行,不需要指正算法本身的错误。急,悬 1 关。
#include<bits/stdc++.h>
using namespace std;
typedef double db;
const int N=30;
const int K=3;
const db eps=1e-9;
int n;
bool vis[K][N];
db f[K][N][2],dir[N][2];
void query(int id,db a,db b,db c){
cout<<"? "<<a<<" "<<b<<" "<<c<<endl;
fflush(stdout);
for(int i=1;i<=n;i++){
scanf("%lf%lf",&f[id][i][0],&f[id][i][1]);
}
}
void print(){
cout<<"! ";
for(int i=1;i<=n;i++){
cout<<dir[i][0]<<" "<<dir[i][1]<<" ";
}
fflush(stdout);
}
db A[K]={0,1,5.7};
db B[K]={1,0,-0.2};
db C[K]={-1,-1,3.4};
int id[K];
db Abs(db x){
return max(x,-x);
}
bool check(db x,db y,int id,int pos){
if(Abs(x-f[id][pos][0])+Abs(y-f[id][pos][1])<eps){
return 1;
}
if(Abs(x-f[id][pos][0])<eps||Abs(y-f[id][pos][1])<eps){
return 0;
}
return Abs((-A[id]/B[id])*((y-f[id][pos][1])/(x-f[id][pos][0]))+1)<eps;
}
void solve(){
memset(vis,0,sizeof vis);
scanf("%d",&n);
for(int i=0;i<K;i++){
query(i,A[i],B[i],C[i]);
}
for(int i=1;i<=n;i++){
bool flag=0;
for(int j=1;j<=n;j++){
id[0]=i,id[1]=j;
if(vis[1][j]){
continue;
}
db x=f[0][i][0],y=f[1][j][1];
bool flag2=1;
for(int d=2;d<K;d++){
bool flag3=0;
for(int p=1;p<=n;p++){
if(vis[d][p]){
continue;
}
if(check(x,y,d,p)){
id[d]=p;
flag3=1;
break;
}
}
if(!flag3){
flag2=0;
break;
}
}
if(flag2){
flag=1;
// printf("i=%d j=%d\n",i,j);
dir[i][0]=x,dir[i][1]=y;
for(int d=0;d<n;d++){
vis[d][id[d]]=1;
}
break;
}
}
}
print();
}
int main(){
int T;
scanf("%d",&T);
while(T--){
solve();
}
return 0;
}