Safecracker(HDU1015 全排列回溯)

来源:互联网 发布:打开pdg文件的软件 编辑:程序博客网 时间:2024/06/05 02:08

题目链接

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <string>#include <cmath>#include <queue>using namespace std;int num, len;char letter[15];int flag;int vis[15];bool cmp(char a, char b){    return a > b;}int p(int n, int i){    int j, sum = 1;    for(j = 0; j < i; j++)        sum *= n;    return sum;}void dfs(int j, char tmp[]){    if(j == 5)    {       if((tmp[0]-'A'+1) - p(tmp[1]-'A'+1, 2) + p(tmp[2]-'A'+1, 3) - p(tmp[3]-'A'+1, 4) + p(tmp[4]-'A'+1, 5) == num)        {            flag = 1;            tmp[5] = '\0';            cout << tmp << endl;        }    }    else    {        if(flag == 1)            return;        int i;        for(i = 0; i < len; i++)        {            if(!vis[i])            {                vis[i] = 1;                tmp[j] = letter[i];                dfs(j+1, tmp);                vis[i] = 0;            }        }    }}int main(){    while(cin >> num >> letter)    {        if(num == 0 && strcmp(letter, "END") == 0)            break;        len = strlen(letter);        sort(letter, letter+len, cmp);        flag = 0;        memset(vis, 0, sizeof(vis));        char tmp[13];        dfs(0, tmp);        if(flag == 0)            cout << "no solution" << endl;    }    return 0;}


0 0
原创粉丝点击