额.....拿到这题感觉没啥思路.....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;
}

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐