【 OJ 】 HDOJ1015 暴搜密码组合问题 [ 14 ]
额.....拿到这题感觉没啥思路.....So.....ummmm ,暴力出奇迹.....直接暴搜了.....然后竟然.....AC了.....super......至理名言....大力出奇迹,暴搜可挂机.....# include<iostream># include<string># include<algorithm&am
·
额.....拿到这题感觉没啥思路.....So.....ummmm ,暴力出奇迹.....直接暴搜了.....然后竟然.....AC了.....
super......至理名言....大力出奇迹,暴搜可挂机.....
# include<iostream>
# include<string>
# include<algorithm>
using namespace std;
bool cmd(char a, char b)
{
return a > b;
}
int RE(char a)
{
return a - 'A'+1;
}
bool DFS(char*letter,int letter_length,int target) {
int index_a, index_b, index_c, index_d, index_e;
//v - w^2 + x^3 - y^4 + z^5 = target 判断标准
//没啥思绪,直接暴力搜索吧
for (index_a = 0; index_a < letter_length; ++index_a) {
for (index_b = 0; index_b < letter_length; ++index_b) {
if (index_b == index_a)
continue;
for (index_c = 0; index_c < letter_length; ++index_c) {
if (index_c == index_b || index_c == index_a)
continue;
for (index_d = 0; index_d < letter_length; ++index_d) {
if (index_d == index_c || index_d == index_b || index_d == index_a)
continue;
for (index_e = 0; index_e < letter_length; ++index_e) {
if (index_e == index_d || index_e == index_c || index_e == index_b || index_e == index_a)
continue;
if ((RE(letter[index_a]) - RE(letter[index_b])
* RE(letter[index_b]) + RE(letter[index_c]) *
RE(letter[index_c]) *RE(letter[index_c]) -
RE(letter[index_d]) *RE(letter[index_d]) *
RE(letter[index_d])*RE(letter[index_d]) +
RE(letter[index_e]) *RE(letter[index_e]) *
RE(letter[index_e]) *RE(letter[index_e]) *
RE(letter[index_e])) == target) {
cout << letter[index_a] << letter[index_b] << letter[index_c] << letter[index_d] << letter[index_e] << endl;
return true;
}
}
}
}
}
}
return false;
}
int main(void) {
// between five and twelve distinct uppercase letters 格言锁 5-12个大写字母
// a positive integer target less than twelve million target 小于1200W
//zero and the letters END; 结束标志 0 和 END
int target;
bool IS_Find;
char letter[13];//最多24个字母....实际5-12
char letter_length;
cin >> target >> letter;
letter_length = strlen(letter);
while (target != 0 || strcmp(letter, "END")) {
letter_length = strlen(letter);
sort(letter, letter + letter_length, cmd);//大于号排序
IS_Find=DFS(letter, letter_length,target);
if (!IS_Find)
cout << "no solution" << endl;
cin >> target >> letter;
}
system("pause");
return 0;
}
看了网上的递归深搜又写了一遍.....ummmmm
# include<iostream>
# include<algorithm>
# include<string>
using namespace std;
//v - w^2 + x^3 - y^4 + z^5 = target
char letter[13];//最多12个字母
bool visit[13];
int Out[13];//保存找到的结果
bool comp(char a, char b) {
return a > b;
}
bool STOP = false;
bool DFS(int n,int lenght, int targrt) {
for (int index = 0; index < lenght&&!STOP; ++index) {
if (!visit[index]) {
Out[n] = letter[index]-'A'+1;//当前点没有被用放入尝试
visit[index] = 1;
if (n == 4) {//找到了5个数字判定是否符合
if (Out[0] - Out[1] * Out[1] + Out[2] * Out[2] * Out[2] - Out[3] * Out[3] * Out[3] * Out[3] + Out[4] * Out[4] * Out[4] * Out[4] * Out[4] == targrt) {
for (int index = 0; index < 5; ++index)
cout << (char)(Out[index] - 1 + 'A');
cout << endl;
STOP = true;
return true;//出去后所有大循环结婚
}
visit[index] = 0;
continue;
}
DFS(n + 1, lenght, targrt);
visit[index] = 0;
}
}
return false;
}
int main(void) {
int target,letter_lenth;
cin >> target >> letter;
while (!(target == 0 && strcmp(letter, "END"))) {
memset(visit, 0, sizeof(visit));//初始化数组
letter_lenth = strlen(letter);//拿到当前字符串长度
sort(letter, letter + letter_lenth, comp);
DFS(0,letter_lenth,target);
if (!STOP) {
cout << "no solution" << endl;
}
STOP = false;
cin >> target >> letter;
}
system("pause");
return 0;
}
更多推荐
已为社区贡献1条内容
所有评论(0)