Fancy Mouse
- -|||
据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]>9continue;
            
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;
}
posted on 2005-09-10 21:37  Fancy Mouse  阅读(347)  评论(1编辑  收藏  举报