据Maigo大牛说,真正能ac的只是a~i这些数字以升序排列的第一个解。
我们还是直接模拟做。入手点是角落里的三个数。
我们还是直接模拟做。入手点是角落里的三个数。
#include<iostream>
using namespace std;
void Solve(int p);
int Occupied(int k,int num[]);
void Print(int num[]);
int Min,Max;
int main()
{
int data,p;
cin>>data;
while(data-- > 0)
{
cin>>p;
Solve(p);
}
return 0;
}
void Solve(int p)
{
if(p<17 || p>23)
{
cout<<"\n";
return;
}
int num[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1};
for(num[0]=(3*p-45/*a+f+i*/)/3-1;num[0]>0;num[0]--)
{
for(num[5]=num[0]+1;num[0]+num[5]*2 < 3*p-45;num[5]++)
{
num[8]=3*p-45-num[0]-num[5];
if(num[8]>9) continue;
int temp,temp1,temp2;
Min=1;Max=9;
while(Occupied(Min,num)) Min++;
while(Occupied(Max,num)) Max--;
for(temp=Min;temp<=Max && 2*temp<p-num[0]-num[5];temp++)
{
if(Occupied(temp,num) || Occupied(p-num[0]-num[5]-temp,num))
continue;
num[1]=temp;
num[3]=p-num[0]-num[5]-num[1];
for(temp1=Min;temp1<=Max && 2*temp1<p-num[0]-num[8];temp1++)
{
if(Occupied(temp1,num) || Occupied(p-num[0]-num[8]-temp1,num))
continue;
num[2]=temp1;
num[4]=p-num[0]-num[8]-num[2];
for(temp2=Min;temp2<=Max && 2*temp2<p-num[5]-num[8];temp2++)
{
if(Occupied(temp2,num) || Occupied(p-num[5]-num[8]-temp2,num))
continue;
num[6]=temp2;
num[7]=p-num[5]-num[8]-num[6];
Print(num);
return;
}
num[2]=-1;
num[4]=-1;
}
num[1]=-1;
num[3]=-1;
}
}
}
}
void FindPair(int sum)
{
}
int Occupied(int k,int num[])
{
if(k<Min || k>Max) return 1;
for(int i=0;i<9;i++)
if(num[i]==k) return 1;
return 0;
}
void Print(int num[])
{
cout<<num[0]<<endl<<num[1]<<' '<<num[2]<<endl<<num[3]<<' '<<num[4]<<endl;
for(int i=5;i<8;i++) cout<<num[i]<<' ';
cout<<num[8]<<endl;
}
using namespace std;
void Solve(int p);
int Occupied(int k,int num[]);
void Print(int num[]);
int Min,Max;
int main()
{
int data,p;
cin>>data;
while(data-- > 0)
{
cin>>p;
Solve(p);
}
return 0;
}
void Solve(int p)
{
if(p<17 || p>23)
{
cout<<"\n";
return;
}
int num[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1};
for(num[0]=(3*p-45/*a+f+i*/)/3-1;num[0]>0;num[0]--)
{
for(num[5]=num[0]+1;num[0]+num[5]*2 < 3*p-45;num[5]++)
{
num[8]=3*p-45-num[0]-num[5];
if(num[8]>9) continue;
int temp,temp1,temp2;
Min=1;Max=9;
while(Occupied(Min,num)) Min++;
while(Occupied(Max,num)) Max--;
for(temp=Min;temp<=Max && 2*temp<p-num[0]-num[5];temp++)
{
if(Occupied(temp,num) || Occupied(p-num[0]-num[5]-temp,num))
continue;
num[1]=temp;
num[3]=p-num[0]-num[5]-num[1];
for(temp1=Min;temp1<=Max && 2*temp1<p-num[0]-num[8];temp1++)
{
if(Occupied(temp1,num) || Occupied(p-num[0]-num[8]-temp1,num))
continue;
num[2]=temp1;
num[4]=p-num[0]-num[8]-num[2];
for(temp2=Min;temp2<=Max && 2*temp2<p-num[5]-num[8];temp2++)
{
if(Occupied(temp2,num) || Occupied(p-num[5]-num[8]-temp2,num))
continue;
num[6]=temp2;
num[7]=p-num[5]-num[8]-num[6];
Print(num);
return;
}
num[2]=-1;
num[4]=-1;
}
num[1]=-1;
num[3]=-1;
}
}
}
}
void FindPair(int sum)
{
}
int Occupied(int k,int num[])
{
if(k<Min || k>Max) return 1;
for(int i=0;i<9;i++)
if(num[i]==k) return 1;
return 0;
}
void Print(int num[])
{
cout<<num[0]<<endl<<num[1]<<' '<<num[2]<<endl<<num[3]<<' '<<num[4]<<endl;
for(int i=5;i<8;i++) cout<<num[i]<<' ';
cout<<num[8]<<endl;
}