標籤:
解題思路:這題相當詭異,範例沒過,交了,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
HDU 1015 Safecracker