個(gè)人感覺這個(gè)題目沒有多少意義,時(shí)間上怎么都不打緊,算法好像也不需要.
它為了考察什么呢?難道是回溯?不過一個(gè)五維循環(huán)也足夠代替回溯了.沒關(guān)
系,既然我的目的是熟悉C++,那么寫寫模擬一類的水題倒是益處多多,一些
思維強(qiáng)度大,代碼精簡的題目反而不不利于我的目的的實(shí)現(xiàn).
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是不是作為一個(gè)合法的len位數(shù)字 */
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 /* 這段過程顯得相當(dāng)惡心,可讀性極差,不過將就過去吧 */
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