HDU 1015 Safecracker

时间:2021-11-07 08:58:56

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

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

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = ;
int vis[maxn], A[maxn], flag, len, sum, p[maxn], n;
char str[maxn]; int cmp(int x, int y)
{
return x > y;
} void DFS(int cnt)
{
if(cnt == )
{
sum = pow(p[], ) - pow(p[],) + pow(p[],) - pow(p[],) + pow(p[],);
if(sum == n) flag = ; //搜到符合条件的就跳出。
return ;
} for(int i = ; i < len; i++)
{
//每个点有选和不选两种情况,所以很自然想到回溯。
if(!vis[i])
{
p[cnt] = A[i];//存储路径
vis[i] = ;
DFS(cnt + );
vis[i] = ;
}
if(flag) return ; //这一步必不可少,表明搜到符合条件的就要立即跳出。
}
return ;
} int main()
{
while(~scanf("%d", &n))
{
memset(vis, , sizeof(vis));
scanf("%s", str);
if(strcmp(str, "END") == ) break;
len = strlen(str);
for(int i = ; i < len; i++) A[i] = str[i] - 'A' + ;
sort(A, A + len, cmp); //直接从大到下排序,搜到第一个符合条件的直接跳出。 flag = ;
DFS();
//flag等于1表示搜到了
if(flag) for(int i = ; i < ; i++) printf("%c", p[i] + );
else printf("no solution");
printf("\n");
}
return ;
}