水题,加了一点点剪枝,有些没用的语句其实是为了调试来着,不过没用着
/*
ID:zizz-zi1
LANG:C
TASK:crypt1
*/
#include <stdio.h>
int a[10],n;
int check(int num)
{
int i;
for(i=0;i<n;i++)
if(num==a[i]) return 1;
return 0;
}
int main(void)
{
FILE *fin,*fout;
fin=fopen("crypt1.in","r");
fout=fopen("crypt1.out","w");
int ans=0,flag,l1,l2,l3,l4,l5,layer[6][5],i,j,tmp;
fscanf(fin,"%d",&n);
for(i=0;i<n;i++)
fscanf(fin,"%d",&a[i]);
for(l1=0;l1<n;l1++)
for(l2=0;l2<n;l2++)
for(l3=0;l3<n;l3++)
for(l4=0;l4<n;l4++){
if(a[l4]*a[l3]>=10) continue;
layer[1][1]=a[l1];
layer[1][2]=a[l2];
layer[1][3]=a[l3];
layer[2][1]=a[l4];
layer[3][1]=(a[l4]*a[l1]);
layer[3][2]=layer[3][1]/10+a[l4]*a[l2];
layer[3][1]%=10;
layer[3][3]=layer[3][2]/10+a[l4]*a[l3];
layer[3][2]%=10;
flag=1;
for(i=1;i<=3;i++)
if(!check(layer[3][i])) flag=0;
if (!flag) continue;
for(l5=0;l5<n;l5++){
if(a[l5]*a[l3]>=10) continue;
layer[2][2]=a[l5];
layer[4][1]=(a[l5]*a[l1]);
layer[4][2]=layer[4][1]/10+a[l5]*a[l2];
layer[4][1]%=10;
layer[4][3]=layer[4][2]/10+a[l5]*a[l3];
layer[4][2]%=10;
flag=1;
for(j=1;j<=3;j++)
if(!check(layer[4][j])) flag=0;
if(!flag) continue;
layer[5][1]=layer[3][1];
layer[5][2]=layer[3][2]+layer[4][1];
layer[5][3]=layer[5][2]/10+layer[3][3]+layer[4][2];
layer[5][2]%=10;
layer[5][4]=layer[5][3]/10+layer[4][3];
layer[5][3]%=10;
for(j=1;j<=4;j++)
if(!check(layer[5][j])) flag=0;
if(!flag) continue;
ans++;
}
}
fprintf(fout,"%d\n",ans);
fclose(fin);fclose(fout);
return 0;
}