1015 Safecracker
深度优先搜索
//使VS在while(scanf(...))时不报错
#pragma warning(disable:4996)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
//直接定义为全局变量即可
int target;
//定义数组大小比题目要求的范围大一点即可
char letters[15];
char result[10];
bool flag;
bool check()
{
int v = result[0] - 'A' + 1;
int w = result[1] - 'A' + 1;
int x = result[2] - 'A' + 1;
int y = result[3] - 'A' + 1;
int z = result[4] - 'A' + 1;
if (v - w * w + x * x * x - y * y * y * y + z * z * z * z * z == target)
return true;
else
return false;
}
//comp是sort函数的第三个参数,默认为升序排序
bool comp(const char a, const char b)
{
return a > b;
}
void dfs(int depth)
{
if (depth == 5)
{
if (check())
{
flag = true;
}
return;
}
for (int i = 0; i < strlen(letters); i++)
{
if (flag)
return;
//不能向result中写入重复的字符
for (int j = 0; j < depth ;j++)
if (result[j] == letters[i])
//跳出多重循环要用goto
goto C;
result[depth] = letters[i];
dfs(depth + 1);
C:;
}
}
int main()
{
while (scanf("%d %s", &target, letters))
{
if ((!target) && (!strcmp(letters, "END")))
break;
flag = false;
sort(letters, letters + strlen(letters), comp);
dfs(0);
if (flag)
printf("%s\n", result);
else
printf("no solution\n");
}
}