首页 > 代码库 > hdu 1015 - Safecracker

hdu 1015 - Safecracker

题目:字母‘A‘~‘Z‘对应数值1~26,现在给你一个字母表和target,从里面选取5个字母v、w、x、y、z,

            使得公式v - w^2 + x^3 - y^4 + z^5 = target成立,找到字典序最大的vwxyz。

分析:简单题、搜索。因为一定选取5个元素,所以直接暴力即可(模拟递归)。

说明:计算时标记取过的字母,避免重复计算。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

char table[13];
int  visit[13];

int value(int v, int w, int x, int y, int z)
{
	v = table[v]-'A'+1; w = table[w]-'A'+1;
	x = table[x]-'A'+1; y = table[y]-'A'+1; z = table[z]-'A'+1;
	return v - w*w + x*x*x - y*y*y*y + z*z*z*z*z;
}

int main()
{
	int target;
	while (~scanf("%d%s",&target,table) && target) {
		int flag = 0,len = strlen(table);
		sort(table, table+len);
		for (int v = len-1 ; v >= 0 ; -- v) {
			visit[v] = 1;
			for (int w = len-1 ; w >= 0 ; -- w) if (!visit[w]) {
				visit[w] = 1;
				for (int x = len-1 ; x >= 0 ; -- x) if (!visit[x]) {
					visit[x] = 1;
					for (int y = len-1 ; y >= 0 ; -- y) if (!visit[y]) {
						visit[y] = 1;
						for (int z = len-1 ; z >= 0 ; -- z) if (!visit[z]) {
							if (value(v, w, x, y, z) == target) {
								printf("%c%c%c",table[v],table[w],table[x]);
								printf("%c%c\n",table[y],table[z]);
								flag = 1;break;
							}
						}visit[y] = 0; if (flag) break;
					}visit[x] = 0; if (flag) break;
				}visit[w] = 0; if (flag) break;
			}visit[v] = 0; if (flag) break;
		}
		if (!flag) printf("no solution\n");
	}
    return 0;
}


hdu 1015 - Safecracker