第一次写DFS的程序,虽然是个水题。
1. 学了memset
2. 可以存下来A-Z的各个次方的结果
3. 可以排序优化
4. 我用了t[0]==0来判断是否有解,也可设个flag
5. 用了递归,也可用五层循环
#include <iostream> #include <cstring> using namespace std; int n; int len; char s[15]; int vis[15]; int t[5]; int p[5]; void check() { for (int i = 0; i < 5; i++) { if (p[i] > t[i]) { for (int j = 0; j < 5; j++) { t[j] = p[j]; } break; } if (p[i] < t[i]) { break; } } } void dfs(int cur) { if (cur == 5) { if (n == p[0] - p[1] * p[1] + p[2] * p[2] * p[2] - p[3] * p[3] * p[3] * p[3] + p[4] * p[4] * p[4] * p[4] * p[4] ) { check(); } } else { for (int i = 0; i < len; i++) { if (!vis[i]) { vis[i] = 1; p[cur] = s[i] - 'A' + 1; dfs(cur + 1); vis[i] = 0; } } } } int main() { while (true) { cin >> n >> s; if (n == 0) { return 0; } len = strlen(s); memset(vis, 0, sizeof(vis)); memset(t, 0, sizeof(t)); memset(p, 0, sizeof(p)); dfs(0); if (t[0] == 0) { cout << "no solution" << endl; } else { for (int i = 0; i < 5; i++) { cout << (char) (t[i] + 'A' - 1); } cout << endl; } } return 0; }