HDU 1015 Safecracker

解题思路:这题相当诡异,样例没过,交了,A了,呵呵,因为理论上是可以通过的,所以

     我交了一发,然后就神奇的过了。首先要看懂题目。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 const int maxn = 15;
 7 int vis[maxn], A[maxn], flag, len, sum, p[maxn], n;
 8 char str[maxn];
 9 
10 int cmp(int x, int y)
11 {
12     return x > y;
13 }
14 
15 void DFS(int cnt)
16 {
17     if(cnt == 5)
18     {
19         sum = pow(p[0], 1) - pow(p[1],2) + pow(p[2],3) - pow(p[3],4) + pow(p[4],5);
20         if(sum == n) flag = 1; //搜到符合条件的就跳出。
21         return ;
22     }
23 
24     for(int i = 0; i < len; i++)
25     {
26         //每个点有选和不选两种情况,所以很自然想到回溯。
27         if(!vis[i])
28         {
29             p[cnt] = A[i];//存储路径
30             vis[i]  = 1;
31             DFS(cnt + 1); 
32             vis[i] = 0;
33         }
34         if(flag) return ; //这一步必不可少,表明搜到符合条件的就要立即跳出。
35     }
36     return ;
37 }
38 
39 int main()
40 {
41     while(~scanf("%d", &n))
42     {
43         memset(vis, 0, sizeof(vis));
44         scanf("%s", str);
45         if(strcmp(str, "END") == 0) break;
46         len = strlen(str);
47         for(int i = 0; i < len; i++) A[i] = str[i] - 'A' + 1;
48         sort(A, A + len, cmp); //直接从大到下排序,搜到第一个符合条件的直接跳出。
49 
50         flag = 0;
51         DFS(0);
52         //flag等于1表示搜到了
53         if(flag)    for(int i = 0; i < 5; i++) printf("%c", p[i] + 64); 
54         else printf("no solution");
55         printf("\n");
56     }
57     return 0;
58 }
View Code

 

posted on 2015-10-05 21:51  改写历史,倾尽天下  阅读(139)  评论(0编辑  收藏  举报

导航