题目点这里
题解:
简单深搜,很暴力。
代码实现:
/*
ID: eashion
LANG: C++
TASK: crypt1
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#define MAX 12
using namespace std;
int N;
int res;
int Lis[MAX];
int num[MAX];
map<int,int> mm;
//void print();
void dfs(int len);
bool test(int x,int len);
int main()
{
freopen("crypt1.in","r",stdin);
freopen("crypt1.out","w",stdout);
while( scanf("%d",&N) != EOF ){
res = 0;
memset(Lis,0,sizeof(Lis));
memset(num,0,sizeof(num));
mm.clear();
for( int i = 0; i < N; i++ ){
scanf("%d",&num[i]);
mm[num[i]] = 1;
}
dfs(0);
printf("%d\n",res);
}
return 0;
}
void dfs(int len){
if( len == 5 ){
int num1;
int d,e;
num1 = Lis[0]*100+Lis[1]*10+Lis[2];
d = Lis[3]; e = Lis[4];
if( test(d*num1,3) && test(e*num1,3) && test( (d*10+e)*num1,4 ) ){
//print();
res++;
}
return ;
}
for( int i = 0; i < N; i++ ){
Lis[len] = num[i];
dfs(len+1);
}
return ;
}
bool test(int x,int len){
int tmp;
int flag = 0;
while( x ){
flag++;
tmp = x%10;
if( mm[tmp] == 0 ){
return false;
}
x /= 10;
}
if( flag != len ){
return false;
}
return true;
}
//
//void print(){
// for( int i = 0; i < N; i++ ){
// printf("%d ",Lis[i]);
// }
// printf("\n");
//}