[HDU 1015] Safecracker
Posted youpeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[HDU 1015] Safecracker相关的知识,希望对你有一定的参考价值。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1015
题目描述:给出一个目标值target,然后给出一个字符串,在字符串中A=1,B=2,...,Z=25,问能否满足运算:$$ v - w^2 + x^3 - y^4 + z^5 = target $$,若满足,则输出字典序最大的字符串,否则输出no solution;
网上说也可以用多重循环暴力来做,但作为对DFS的一个学习,还是用DFS+回溯的思想来做吧。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 25;
int n, a[maxn], b[maxn], len;
char ch[maxn], temp;
bool flag, vis[maxn];
bool cmp(int p, int q) {
return p > q;
}
void check() {
if (n == b[0] - b[1] * b[1] + b[2] * b[2] * b[2] - b[3] * b[3] * b[3] * b[3] + b[4] * b[4] * b[4] * b[4] * b[4])
flag = true;
return;
}
void DFS(int num) {
if (flag)
return;
if (num == 5) {
check();
return;
}
for (int i = 0; i < len; i++) {
if (!vis[i] && !flag) {
vis[i] = true;
b[num] = a[i];
DFS(num + 1);
vis[i] = false;
}
}
}
int main() {
while (cin >> n >> ch && n && ch != "END") {
len = strlen(ch);
for (int i = 0; i < len; i++) {
a[i] = ch[i] - 'A' + 1;
}
flag = false;
sort(a, a + len, cmp);
DFS(0);
if (flag) {
for (int i = 0; i < 5; i++) {
temp = b[i] - 1 + 'A';
printf("%c", temp);
}
printf("\n");
} else {
printf("no solution\n");
}
}
return 0;
}
以上是关于[HDU 1015] Safecracker的主要内容,如果未能解决你的问题,请参考以下文章