HDU水题(2)

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");
    }
}
发布了17 篇原创文章 · 获赞 0 · 访问量 572

猜你喜欢

转载自blog.csdn.net/kybxdkybxd/article/details/103026681