个人感觉这个题目没有多少意义,时间上怎么都不打紧,算法好像也不需要.
它为了考察什么呢?难道是回溯?不过一个五维循环也足够代替回溯了.没关
系,既然我的目的是熟悉C++,那么写写模拟一类的水题倒是益处多多,一些
思维强度大,代码精简的题目反而不不利于我的目的的实现.
1 /*
2 ID:31440461
3 PROG:crypt1
4 LANG:C++
5 */
6 #include<iostream>
7 using namespace std;
8
9 int n,a[10],ans=0,b[10];
10 bool ok[10];
11
12 /* 这里判断num是不是作为一个合法的len位数字 */
13 bool legal(int num,int len)
14 {
15 bool flag=1;
16 while (num)
17 {
18 flag&=ok[num%10];
19 if(!flag) return 0;
20 num/=10;
21 --len;
22 }
23 return flag&&(!len);
24 }
25
26 /* 这段过程显得相当恶心,可读性极差,不过将就过去吧 */
27 void search(int p)
28 {
29 if (p>4)
30 {
31 if (!(b[0] && b[3] && b[4])) return;
32 int num=b[0]*100+b[1]*10+b[2];
33 if ( legal(num,3) && legal(num*b[3],3) && legal(num*b[4],3) && legal(num*10*b[3]+num*b[4],4) ) ++ans;
34 return;
35 }
36 for (int i=0;i<n ;i++ ) b[p]=a[i],search(p+1);
37 }
38
39 void solve()
40 {
41 cin >> n;
42 memset(ok,0,sizeof(ok));
43 for (int i=0;i<n ;i++ ) cin >> a[i],ok[a[i]]=1;
44 search(0);
45 }
46
47
48 int main()
49 {
50 freopen("crypt1.in","r",stdin);
51 freopen("crypt1.out","w",stdout);
52 solve();
53 cout << ans << endl;
54 return 0;
55 }
56