数据加载中……

USACO 1.3.4 Prime Cryptarithm

个人感觉这个题目没有多少意义,时间上怎么都不打紧,算法好像也不需要.
它为了考察什么呢?难道是回溯?不过一个五维循环也足够代替回溯了.没关
系,既然我的目的是熟悉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 


posted on 2009-07-13 19:21 Chen Jiecao 阅读(294) 评论(0)  编辑 收藏 引用 所属分类: USACO


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理