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 }