这是我参与8月更文挑战的第2天,活动详情查看: 8月更文挑战
算法设计与分析题目1:
从str中选5个字母(a, b, c, d, e)构成密码
满足, a - b * b + c * c * c - d * d * d * d + e * e * e * e * e == n
输入:
(1)整数n
(2)str,由不同大写字母组成,5≤长度≤12
输出:
符合规则的str的密码,无则no solution
核心代码及注释:
/* 5层循环暴力破解 */
int flag = 1;
for (int i = 0; i < s.size() && flag; i++) {
int a = s[i] - 'A' + 1;//临时存放字母的序数
int A = a;//1次方
for (int j = 0; j < s.size() && flag; j++) {
if (i == j) continue;
int b = s[j] - 'A' + 1;
int B = b * b;//2次方
for (int k = 0; k < s.size() && flag; k++) {
if (i == k || j == k) continue;
int c = s[k] - 'A' + 1;
int C = c * c * c;//3次方
for (int l = 0; l < s.size() && flag; l++) {
if (i == l || j == l || k == l) continue;
int d = s[l] - 'A' + 1;
int D = d * d * d * d;//4次方
for (int m = 0; m < s.size() && flag; m++) {
if (i == m || j == m || k == m || l == m) continue;
int e = s[m] - 'A' + 1;
int E = e * e * e * e * e;//5次方
int sum = A - B + C - D + E;
if (sum == n) {
flag = 0;
cout << (char)(a + 'A' - 1);
cout << (char)(b + 'A' - 1);
cout << (char)(c + 'A' - 1);
cout << (char)(d + 'A' - 1);
cout << (char)(e + 'A' - 1);
cout << endl;
}
}//m
}//l
}//k
}//j
}//i
测试结果: /* 输入1 */
int n = 1;
s = "ABCDEFGHIJKL";
/* 输入2 */
int n = 11700519;
s = "ZAYEXIWOVU";
/* 输入3 */
int n = 3072997;
s = "SOUGHT";
/* 输入4 */
int n = 1234567;
s = "THEQUICKFROG";
输出结果:
算法设计与分析题目2: 最大团:无向图G中含顶点个数最多的完全子图
完全图:任意2个顶点之间都存在边
输入:
(1)n个顶点,编号1...n
(2)m条无向边
输出:
最大团的顶点个数
输入样例:
5 6 //第一行n m:n个顶点、m条边
1 2 //下面m行(s, t):顶点s和顶点t之间有一条边
2 3
2 4
3 4
3 5
4 5
核心代码及注释:
int max = 1;
for (int i = 1; i <= n; i++) {//依次遍历n个顶点
/* 遍历n个点 */
queue * q = new queue();
for (int j = i + 1; j <= n; j++) {
if (G[i][j]) {//若从顶点i到顶点j有边,顶点j入队
q->in(j);
}
}
/* 初始cur_max=1,因为[当前顶点]与[最近准备出队顶点]之间,必存在边 */
int cur_max = 1;
while (!q->isEmpty()) {
int val = q->out();//依次出队与当前顶点相邻的顶点
int flag = 1;//==1时,表示还没破坏完全图的规则
for (int j = 0; j < q->getSize(); j++) {//遍历[队列剩余顶点]
if (!G[val][q->get()]) {//如果[当前出队顶点]与[队列中剩余的所有顶点]之间无边,就不能保证完全图,退出当前循环
flag = 0;
break;
}
}
if (flag) cur_max++;//累计当前最大团的顶点个数
}
max = cur_max > max ? cur_max : max;
delete(q);
}
输入: 5 6
1 2
2 3
2 4
3 4
3 5
4 5
输出:结果正确