HNU-算法设计与分析-作业5
第五次作业【回溯算法】
文章目录
- 第五次作业【回溯算法】
- <1> 算法分析题5-3 回溯法重写0-1背包
- <2> 算法分析题5-5 旅行商问题(剪枝)
- <3> 算法实现题5-2 最小长度电路板排列问题
- <4> 算法实现题5-7 n色方柱问题
- <5> 算法实现题5-13 任务分配问题
<1> 算法分析题5-3 回溯法重写0-1背包
▲问题重述
一共有N件物品,第i(i从0开始)件物品的重量为weight[i],价值为value[i]。在总重量不超过背包承载上限maxw的情况下,求能够装入背包的最大价值是多少?并要求输出选取的物品编号。
(要求使用回溯法求解)
▲解题思路
使用回溯法。构造解空间树,从第0层到第n-1层,每层表示对于背包内某个物品的“取”或“不取”。第n层为答案层,在第n层进行判定结果是否是想要的(即能不能获得更优的解),若是就做出相应的处理。
这是一个万能的解空间树图,借来用用。
剪枝想法:
(1)如果在第n层之前,就出现了总和大于的maxw情况,那么此时已经超重了。之后无论是否取,都不可能再得到总和小于maxw的结果了。这种情况以及它的子树直接删去即可。
(2)如果在第n层之前,目前已有的价值,即使加上剩余可取的最大价值,也不能达到已经达到的bestv,那么之后即使全部取也不能达到bestv了。这种情况及它的子树直接删去即可。
剪枝代码可以删去,不影响结果,但会降低效率。
▲代码
// -*- coding:utf-8 -*-// File : 01背包问题(回溯).cpp
// Time : 2023/12/14
// Author : wolf#include <iostream>
using namespace std;int w[5000];
int v[5000];
bool flag[5000];
bool ans[5000];
int now_w = 0, now_v = 0;
int n, maxw, bestv = 0;
int rest_v;void backtrace(int depth)
{if (depth == n) // 到达第n层:答案{if (now_v > bestv && now_w <= maxw) // 答案是需要打印的{bestv = now_v;for (int i = 0; i < n; i++){ans[i] = flag[i];}}return;}if (depth < n && now_w > maxw)return; // 剪枝:此时背包已经过重if (now_v + rest_v <= bestv)return; // 剪枝:此时剩余价值即使全部拾取也无法达到最大价值rest_v -= v[depth];// 取这个物品now_v += v[depth];now_w += w[depth];flag[depth] = 1;backtrace(depth + 1);now_v -= v[depth];now_w -= w[depth];flag[depth] = 0;// 不取这个物品backtrace(depth + 1);rest_v += v[depth];return;
}int main()
{cin >> maxw >> n;for (int i = 0; i < n; i++){cin >> w[i] >> v[i];ans[i] = 0;flag[i] = 0;rest_v += v[i];}backtrace(0);for (int i = 0; i < n; i++){if (ans[i])cout << i << " ";}cout << endl;cout << bestv << endl;return 0;
}
▲验证
洛谷P1048(https://www.luogu.com.cn/problem/P1048)
【验证时把输出最优解向量的for循环删去,题目要求不一样】
回溯法解决背包问题的O(2n)还是从数量级上显著不如动态规划的O(n2)。
故在数据量很大的时候,不能通过测评,显示超时。
所以01背包问题还是得用动态规划解,本题只是练习一下回溯法。
<2> 算法分析题5-5 旅行商问题(剪枝)
▲题目重述
▲解答
▲代码
// -*- coding:utf-8 -*-// File : 5-5 旅行售货员问题.cpp
// Time : 2023/12/30
// Author : wolf#include <iostream>using namespace std;
int const MAXINT = 99999;
int map[1000][1000];
int v, e, best_cost = MAXINT, now_cost = 0;
int now_order[1000]; // 储存当前排列解向量
int ans[1000]; // 储存结果排列解向量
int upbound;void swap(int a, int b)
{int temp = now_order[a];now_order[a] = now_order[b];now_order[b] = temp;
};void backtrack(int depth)
{if (depth == v - 1) // 到达答案层{if (map[now_order[depth]][now_order[0]] != -1) // 能跟第一个相连{now_cost += map[now_order[depth]][now_order[0]];if (now_cost < best_cost) // 更优,保存结果{best_cost = now_cost;for (int i = 0; i < v; i++){ans[i] = now_order[i];}}now_cost -= map[now_order[depth]][now_order[0]];}}else{for (int i = depth; i < v; i++) // 生成排列树当前向量中depth位置的节点编号(第depth个访问哪个节点){if (map[now_order[depth - 1]][now_order[i]] != -1) // 前一节点到当前的这个节点有可达边{if (now_cost + map[now_order[depth - 1]][now_order[i]] <= upbound)// 剪枝:若当前步骤使得费用和就大于上界了,不必继续{swap(i, depth);now_cost += map[now_order[depth - 1]][now_order[depth]];backtrack(depth + 1);now_cost -= map[now_order[depth - 1]][now_order[depth]];swap(i, depth);}}}}return;
}
int main()
{cin >> v >> e;for (int i = 0; i < v; i++)for (int j = 0; j < v; j++)map[i][j] = -1;for (int i = 0; i < e; i++){int a, b, weight;cin >> a >> b >> weight;map[a][b] = weight;map[b][a] = weight;}// 剪枝预备:for (int i = 0; i < v; i++){int i_out_max = 0; // 存储从i节点向外for (int j = 0; j < v; j++){i_out_max = max(i_out_max, map[i][j]);}upbound += i_out_max;}// 指定从0号节点开始遍历// 反正最后每一个节点都需要遍历过for (int i = 0; i < v; i++)now_order[i] = i; // 初始按照递增顺序(初始顺序是无所谓的,只要保证都能遍历一遍就可以)backtrack(1); // 0号节点已固定,搜索从1号节点开始的全排列cout << best_cost << endl;return 0;
}
▲验证
input
4 5
0 1 10
0 2 15
1 2 35
1 3 25
2 3 30output
50
<3> 算法实现题5-2 最小长度电路板排列问题
▲问题重述
▲解题思路
排列树解决问题。创建以下函数/类
- Board 类:
class Board
定义了一个名为Board
的类,用于处理电路板排列问题。- 私有成员变量包括
n
(电路板数)、m
(连接块数)、x
(当前解的数组)、bestx
(当前最优解的数组)、bestd
(当前最优密度)、low
(辅助数组,存储连接块的最小高度)、high
(辅助数组,存储连接块的最大高度)、B
(连接块数组)。
- len 函数:
int len(int ii)
用于计算排列中的某一部分的长度,即连接块之间的最大高度差。- 该函数首先将
low
和high
数组初始化为合适的值,然后根据当前排列计算连接块的最小和最大高度,最后计算最大高度差并返回。
- Backtrack 函数:
void Backtrack(int i)
是一个递归函数,用于在排列树上进行回溯搜索,寻找最优解。- 当达到排列树的终点(
i == n
)时,计算当前排列的长度,并更新最优解。 - 否则,对于当前位置
i
,尝试选择不同的电路板进行交换,然后继续递归搜索。
- ArrangeBoards 函数:
int ArrangeBoards(int **B, int n, int m, int *bestx)
是主要的调用函数。- 在该函数中,创建一个
Board
类的实例X
,并通过初始化设置其成员变量。 - 利用回溯算法调用
Backtrack(1)
来找到最优解。 - 返回最优解的密度。
- main 函数:
main
函数读取输入,调用ArrangeBoards
函数来解决问题,并输出结果。- 动态分配二维数组
B
以存储连接块信息。 - 读取输入的电路板连接信息。
- 创建数组
bestx
用于存储最优解。 - 输出最优解的密度和排列。
▲代码
// 电路板排列问题
#include <bits/stdc++.h>
using namespace std;
class Board
{friend int ArrangeBoards(int **, int, int, int *);private:void Backtrack(int i);int len(int ii);int n, // 电路板数m, // 连接块数*x, // 当前解*bestx, // 当前最优解bestd, // 当前最优密度*low, //*high, //**B; // 连接块数组
};
int Board::len(int ii)
{for (int i = 0; i <= m; i++){high[i] = 0;low[i] = n + 1;}for (int i = 1; i <= ii; i++){for (int k = 1; k <= m; k++){if (B[x[i]][k]){if (i < low[k])low[k] = i;if (i > high[k])high[k] = i;}}}int tmp = 0;for (int k = 1; k <= m; k++){if (low[k] <= n && high[k] > 0 && tmp < high[k] - low[k])tmp = high[k] - low[k];}return tmp;
}
void Board::Backtrack(int i) // 回溯搜索排列树
{if (i == n) // 到达排列树终点{int tmp = len(i);if (tmp < bestd){bestd = tmp;for (int j = 1; j <= n; j++)bestx[j] = x[j];}}else{for (int j = i; j <= n; j++) // 选择x[j]为下一块电路板{swap(x[i], x[j]);int ld = len(i);if (ld < bestd)Backtrack(i + 1);swap(x[i], x[j]);}}
}
int ArrangeBoards(int **B, int n, int m, int *bestx)
{Board X;// 初始化XX.x = new int[n + 1];X.low = new int[m + 1];X.high = new int[m + 1];X.B = B;X.n = n;X.m = m;X.bestx = bestx;X.bestd = n + 1;// 初始化total和nowfor (int i = 1; i <= n; i++){X.x[i] = i;}X.Backtrack(1);delete[] X.x;delete[] X.low;delete[] X.high;return X.bestd;
}
int main()
{int n, m;cin >> n >> m;int **B = new int *[n + 1];for (int i = 0; i <= n; i++)B[i] = new int[m + 1];for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> B[i][j];int *bestx = new int[n + 1];for (int i = 1; i <= n; i++)bestx[i] = 0;int ans = ArrangeBoards(B, n, m, bestx);cout << ans << endl;for (int i = 1; i <= n; i++)cout << bestx[i] << " ";cout << endl;return 0;
}
▲验证
测试案例
8 5
1 1 1 1 1
0 1 0 1 0
0 1 1 1 0
1 0 1 1 0
1 0 1 0 0
1 1 0 1 0
0 0 0 0 1
0 1 0 0 1
测试结果:
<4> 算法实现题5-7 n色方柱问题
▲问题重述
设有 n 个立方体,每个立方体的每一面用红、黄、蓝、绿等 n 种颜色之一染色。要把这n 个立方体叠成一个方形柱体,使得柱体的 4 个侧面的每一侧均有 n 种不同的颜色。试设计一个回溯算法,计算出 n 个立方体的一种满足要求的叠置方案。
对于给定的 n 个立方体以及每个立方体各面的颜色,计算出 n 个立方体的一种叠置方案,使得柱体的 4 个侧面的每一侧均有 n 种不同的颜色。
数据输入:
第一行有 1 个正整数 n,0< n< 27,表示给定的立方体个 数和颜色数均为 n。第 2 行是 n 个大写英文字母组成的字符串。该字符串的第 k(0≤ k< n) 个字符代表第 k 种颜色。接下来的 n 行中,每行有 6 个数,表示立方体各面的颜色。立方体各面的编号如下图所示。
图中 F 表示前面,B 表示背面,L 表示左面,R 表示右面,T 表示顶面,D 表示底面。相 应地,2 表示前面,3 表示背面,0 表示左面,1 表示右面,5 表示顶面,4 表示底面。
例如,在示例输出文件中,第3行的6个数0 2 1 3 0 0分别表示第1个立方体的左面的颜色为R, 右面的颜色为B, 前面的颜色为G, 背面的颜色为Y, 底面的颜色为R, 顶面的颜色为 R。
案例:
input
4
RGBY
0 2 1 3 0 0
3 0 2 1 0 1
2 1 0 2 1 3
1 3 3 0 2 2 output
RBGYRR
YRBGRG
BGRBGY
GYYRBB
▲解题思路
在下面的代码中使用注释讲解。使用回溯法的思路套用回溯法的模板,但有改动。
本题比较晦涩难懂,在理解上需要花很多时间。
关于代码部分的映射方式
▲代码
// -*- coding:utf-8 -*-// File : 5-7 n色方柱问题.cpp
// Time : 2023/12/27
// Author : wolf#include <iostream>using namespace std;
char color[28]; // 用来储存输入的数字对应的颜色(只在输出的时候转换为字符,在做题时使用数字存储)
int box[28][6]; // box[i][j]用来储存第i个立方体各个面(即第j面)的颜色
int n;
int count = 1; // 标记这是第几个输出的;可能结果
const int place[24][6] = {// 转动立方体的映射函数,使用box[depth+1][j]=origin[place[method][j]]来获取第method种方法下下一层的摆放方式// place[i][j]为第i种转换方法下该立方体该层的第j面应该变换为place[i][j]{0, 1, 2, 3, 4, 5},{4, 5, 2, 3, 1, 0},{1, 0, 2, 3, 5, 4},{5, 4, 2, 3, 0, 1}, // 2为底面,3为顶面{0, 1, 3, 2, 4, 5},{4, 5, 3, 2, 1, 0},{1, 0, 3, 2, 5, 4},{5, 4, 3, 2, 0, 1}, // 3为底面,2为顶面{3, 2, 0, 1, 4, 5},{4, 5, 0, 1, 2, 3},{2, 3, 0, 1, 5, 4},{5, 4, 0, 1, 3, 2}, // 0为底面,1为顶面{3, 2, 1, 0, 4, 5},{4, 5, 1, 0, 2, 3},{2, 3, 1, 0, 5, 4},{5, 4, 1, 0, 3, 2}, // 1为底面,0为顶面{1, 0, 4, 5, 3, 2},{3, 2, 4, 5, 0, 1},{0, 1, 4, 5, 2, 3},{2, 3, 4, 5, 1, 0}, // 4为底面,5为顶面{1, 0, 5, 4, 3, 2},{3, 2, 5, 4, 0, 1},{0, 1, 5, 4, 2, 3},{2, 3, 5, 4, 1, 0}, // 5为底面,4为顶面
};void backtrack(int depth)
{// cout << "depth=" << depth << endl;if (depth == n - 1) // 到达答案层{cout << "Possible Solution " << count << " : " << endl;count++;for (int i = 0; i < n; i++){for (int j = 0; j < 6; j++){cout << color[box[i][j]] << " ";}cout << endl;}cout << endl;}else{int process = depth + 1;int origin[6];// 【使用origin[]数组先保存原始情况,可以省去整体恢复原状的步骤,24次for循环每次都是新的开始】for (int i = 0; i < 6; i++) // 保存待处理层初始存放的颜色origin[i] = box[process][i]; // origin[i]表示该层初始第i个面存放的颜色// cout << "origin=" << endl;// for (int i = 0; i < 6; i++)// cout << origin[i] << " ";// cout << endl;for (int i = 0; i < 24; i++) // 列举子集树,每个立方体有24种放法,第i种方法{// cout << "method = " << i << endl;for (int j = 0; j < 6; j++) // 按照该种方案的映射,把处理的该层立方体先摆好{box[process][j] = origin[place[i][j]];}// 接下来看这种摆法是否可行int flag = 1; // 初始标记,表示可行// 表示遍历某个侧面时,是否出现重复颜色,used_i[j]标记第i个侧面第j号颜色是否被用过,初始清零int used_0[n];int used_1[n];int used_2[n];int used_3[n];for (int i = 0; i < n; i++) //{used_0[i] = 0;used_1[i] = 0;used_2[i] = 0;used_3[i] = 0;}for (int i = 0; i <= process; i++) // 遍历到现在所有已经放好的立方体,查看每个侧面是否有重复的颜色{used_0[box[i][0]]++;used_1[box[i][1]]++;used_2[box[i][2]]++;used_3[box[i][3]]++;if (used_0[box[i][0]] > 1 || used_1[box[i][1]] > 1 || used_2[box[i][2]] > 1 || used_3[box[i][3]] > 1)// 题目要求是最后摆好的整个立方体条的每个侧面都要有n种颜色// 但因为n个立方体摆出的,该侧面条有n种颜色,所以相当于每个立方体在该侧面的颜色都不一样// 即某个侧面条上每种颜色只能使用一次,这里转换了题目的条件// 某个侧面条上某个颜色用了不止一次,不符合条件,该方案以及该方案的子树剪掉{flag = 0;// cout << used_0[box[i][0]] << " " << used_1[box[i][1]] << " " << used_2[box[i][2]] << " " << used_3[box[i][3]] << endl;break;}}if (flag == 1) // 目前所有已经摆好的立方体的每个侧面都没有重复的颜色,符合要求,可以继续放下一个立方体backtrack(depth + 1);}}return;
}int main()
{cin >> n;for (int i = 0; i < n; i++){cin >> color[i];}for (int i = 0; i < n; i++){for (int j = 0; j < 6; j++){cin >> box[i][j];}}cout << endl<< "ans = " << endl;backtrack(-1);return 0;
}
▲验证
未找到在线测评,使用题目给出的案例
input
4
RGBY
0 2 1 3 0 0
3 0 2 1 0 1
2 1 0 2 1 3
1 3 3 0 2 2
输出结果如下:
ans =
Possible Solution 1 :
R B G Y R R
Y R B G R G
B G R B G Y
G Y Y R B BPossible Solution 2 :
B R G Y R R
R Y B G G R
G B R B Y G
Y G Y R B BPossible Solution 3 :
R B Y G R R
Y R G B R G
B G B R G Y
G Y R Y B BPossible Solution 4 :
B R Y G R R
R Y G B G R
G B B R Y G
Y G R Y B BPossible Solution 5 :
Y G R B R R
G B Y R R G
B R B G G Y
R Y G Y B BPossible Solution 6 :
G Y R B R R
B G Y R G R
R B B G Y G
Y R G Y B BPossible Solution 7 :
Y G B R R R
G B R Y R G
B R G B G Y
R Y Y G B B Possible Solution 8 :
G Y B R R R
B G R Y G R
R B G B Y G
Y R Y G B B
可见答案不唯一(显然可能),题目给定的答案在其中之一。
我们这种算法的时间复杂度O(n*24^n),数据量大了之后可能会很慢。
<5> 算法实现题5-13 任务分配问题
▲问题重述
问题描述: 设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为 cij。试设计一个算法,为每一个人都分配1 件不同的工作,并使总费用达到最小。
算法设计:设计一个算法,对于给定的工作费用,计算最佳工作分配方案,使总费用达到最小。
数据输入:第一行有1 个正整数n (1≤n≤20)。接下来的n行,每行n个数,表示工作费用。
样例:
input
3
10 2 3
2 3 4
3 4 5output
9
▲解题思路
假设人不动,将工作分发给不同人。
解向量x[i]为第i个人被分配第x[i]个工作,解空间树为排列树。从第0层开始,第0层就有n个节点(可以认为第-1层有一个节点),答案层在第n层(第n-1层将自己与自己交换,实际上不影响最终结果)。在第n层比较当前总费用是不是比目前保存的方案总费用更少,如果是就将这个更小的存下来,否则不做处理。
遍历完整个排列树后得到最优解。
▲代码
// -*- coding:utf-8 -*-// File : 5-13.cpp
// Time : 2023/12/25
// Author : wolf#include <iostream>using namespace std;
const int MAXNUM = 9999999;
int c[21][21];
int x[21];
int nowcost = 0, mincost = MAXNUM, n;void swap(int a, int b)
{int temp = x[a];x[a] = x[b];x[b] = temp;
}void backtrack(int depth)
{if (depth == n) // 答案层{mincost = min(mincost, nowcost);// cout << nowcost << endl;// 不需要输出解向量,故不用保存解向量}else{for (int i = depth; i < n; i++){// depth当前人,i为待分发物品序号,人不动,发物品nowcost += c[x[i]][depth];swap(i, depth);backtrack(depth + 1);swap(i, depth);nowcost -= c[x[i]][depth];}}
}int main()
{cin >> n;for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){cin >> c[i][j];}}for (int i = 0; i < n; i++)x[i] = i;backtrack(0);cout << mincost << endl;return 0;
}
▲验证
测试数据可通过。
相关文章:

HNU-算法设计与分析-作业5
第五次作业【回溯算法】 文章目录 第五次作业【回溯算法】<1> 算法分析题5-3 回溯法重写0-1背包<2> 算法分析题5-5 旅行商问题(剪枝)<3> 算法实现题5-2 最小长度电路板排列问题<4> 算法实现题5-7 n色方柱问题<5> 算法实现…...

基础之音视频2
01 前言 02 mp 03 mp实例 简易音乐播放器 04 音频 sound-pool 1.作用 播放多个音频,短促音频 2.过程 加载load- 3.示例 模拟手机选铃声 步骤: 创建SoundPool对象,设置相关属性 音频流存入hashmap 播放音频 05 videoview 3gp 体积小 mp4 …...

两小时看完花书(深度学习入门篇)
1.深度学习花书前言 机器学习早期的时候十分依赖于已有的知识库和人为的逻辑规则,需要人们花大量的时间去制定合理的逻辑判定,可以说是有多少人工,就有多少智能。后来逐渐发展出一些简单的机器学习方法例如logistic regression、naive bayes等…...

21【Aseprite 作图】画白菜
1 对着参考图画轮廓 2 缩小尺寸 变成这样 3 本来是红色的描边,可以通过油漆桶工具(取消 “连续”),就把红色的轮廓线,变成黑色的 同时用吸管工具,吸取绿色和白色,用油漆桶填充颜色 4 加上阴影…...

2024.05.15 [AI开发配环境]个人使用最新版远程服务器配环境大纲:docker、云盘、ssh、conda等
不包括在宿主机安装docker。 docker 找到心仪的镜像,比如从网上pull:https://hub.docker.com/r/pytorch/pytorch/tags?page&page_size&ordering&name2.0.1 docker pull pytorch/pytorch:2.0.1-cuda11.7-cudnn8-devel# 新建容器 docker r…...

opencv 轮廓区域检测
直线检测 void LineDetect(const cv::Mat &binaryImage) {cv::Mat xImage,yImage,binaryImage1,binaryImage2;// 形态学变化,闭操作 先膨胀,再腐蚀 可以填充小洞,填充小的噪点cv::Mat element cv::getStructuringElement(cv::MORPH_RE…...

2024-5-16
今日安排: 完结 nf_tables 模块的基本学习,然后开始审计源码mount 的使用,学习 namespace (昨昨昨昨天残留的任务)(:看我能搁到什么时候静不下心学习新知识就做 CTF 题目🦑🦑🦑 今…...

IT行业的现状与未来:技术创新引领时代变革
随着技术的不断进步,IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链,这些技术正在重塑我们的生活和工作方式。本文将探讨当前IT行业的现状及未来发展趋势,并邀请行业领袖、技术专家和创…...

Redis分布式锁【简单版】
文章目录 概要例子1【SETNX EXPIRE】例子2【 Redisson 】 概要 redis分布式锁六种方案 SETNX EXPIRE 方案: 描述:使用Redis的SETNX命令来尝试设置一个键值对,如果该键不存在,则设置成功并设置过期时间,实现锁的功能…...

18.Blender 渲染工程、打光方法及HDR贴图导入
HDR环境 如何导入Blender的HDR环境图 找到材质球信息 在右上角,点击箭头,展开详细部分 点击材质球,会出现下面一列材质球,将鼠标拖到第二个材质球,会显示信息 courtyard.exr 右上角打开已渲染模式 左边这里选择世界…...

VBA在Excel中部首组查字法的应用
VBA在Excel中部首组查字法的应用 文章目录 前言一、网站截图二、操作思路三、代码1.创建数据发送及返回方法2.创建截取字符串中的数值的方法3.获取部首对应的编码4.获取特定部首的汉字运行效果截图前言 使用汉语字典查生字、生词,多用拼音查字法和部首查字法。以前都是用纸质…...

ASP.NET MVC 4升级迁移到ASP.NET MVC 5
背景:今天针对一个老项目进行框架升级,老项目使用的是MVC 4,现在要升级到MVC5。 备份项目.NET升级4.5以上版本通过Nuget,更新或者直接安装包 包名oldVersionnewVersion说明Microsoft.AspNet.Mvc4.0.05.x.xMicrosoft.AspNet.Razo…...

AIGC时代已至,你准备好抓住机遇了吗?
一、行业前景 AIGC,即人工智能生成内容,是近年来人工智能领域中发展迅猛的一个分支。随着大数据、云计算、机器学习等技术的不断进步,AIGC已经取得了显著的成果,并且在广告、游戏、自媒体、教育、电商等多个领域实现了广泛应用。…...
2024CCPC郑州邀请赛暨河南省赛
比赛记录:看群里大家嘎嘎拿牌,自己个人来solo了一下,发现简单到中等题很多,写了两小时出了7题,但是写的比较慢,对难题把握还是不准确 补题 : A题确实巧妙充分利用题目的数据范围来思考问题&…...

Spring 各版本发布时间与区别
版本版本特性Spring Framework 1.01. 所有代码都在一个项目中 2. 支持核心功能IoC、AOP 3. 内置支持Hibernate、iBatis等第三方框架 4. 对第三方技术简单封装。如:JDBC、Mail、事务等 5. 只支持XML配置方式。6.主要通过 XML 配置文件来管理对象和依赖关系࿰…...

前端模块导入导出方式
不同的导出方式和相应的导入方式,可以提炼成 3 种类型:name、default 和 list。 以下是使用示例: // Name Export | Name Import // 一个“命名”的导出 export const name value import { name } from ...❌ 错误示例: export…...

docker01-简介和概述
什么是docker? 我们现在开发项目是在windows操作系统使用idea开发,本地windows操作系统上有我们项目所需的jdk,mysql,redis,tomcat等环境,如果我们想打包我们的项目到一个别的服务器上,在别的服…...

java数据结构与算法(对称二叉树)
前言 为什么学习数据结构和算法? 1.直面大厂的高薪。 2.学习编程的语言。 3.输出优雅的代码和高性能的程序。 每日练习2题,希望大家都能收获高薪offer,实现自由跳槽。 实现原理 主要判断二叉树的以中间线为轴,两边的对称的…...

[原创](Modern C++)现代C++的std::function, 强大的多态函数包装器(包含std::mem_fn使用方式).
[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…...

解决间歇性 SSLPeerUnverifiedException 问题
问题背景 您在使用 SonarQube 与 GitHub Enterprise 进行拉取请求装饰时,遇到了间歇性的 javax.net.ssl.SSLPeerUnverifiedException 异常。具体错误信息如下: txt javax.net.ssl.SSLPeerUnverifiedException: Hostname XXXXXXX not verified (no certificates)at okhttp3…...

Linux程序开发(一):Linux基础入门安装和实操手册
Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…...

Java | Leetcode Java题解之第92题反转链表II
题目: 题解: class Solution {public ListNode reverseBetween(ListNode head, int left, int right) {// 设置 dummyNode 是这一类问题的一般做法ListNode dummyNode new ListNode(-1);dummyNode.next head;ListNode pre dummyNode;for (int i 0; …...

声纹识别在无人机探测上的应用
无人机在民用和军事领域的应用越来越广泛。然而,随着无人机数量的增加,"黑飞"现象也日益严重,对公共安全和隐私构成了威胁。因此,开发有效的无人机探测与识别技术变得尤为重要。及时发现黑飞无人机的存在进而对其型号进…...

【数据结构】时间、空间复杂度实例分析
跌倒了,就重新站起来,继续向前走;傻坐在地上是没用的。💓💓💓 目录 •✨说在前面 🍋知识点一:算法的效率 • 🌰1.斐波那契数列的第n项 • 🌰2.算法的复杂度…...

2024生日快乐祝福HTML源码
源码介绍 2024生日快乐祝福HTML源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面, 源码截图 源码下载 2024生日快乐祝福HTML源码...

Android系统不同版本存储权限
一、Android存储简介 Android系统分为内部存储和外部存储 从Android6.0开始不断在更新存储(读写)权限,除了在AndroidManifest.xml文件里声明,app运行时也要动态申请使用对应的权限 提醒:应用私有存储不需要动态申请权…...

ue引擎游戏开发笔记(41)——行为树的建立(2)--丰富ai行为:巡逻后返回原处
1.需求分析: 就敌人ai而言,追踪到敌人有可能丢失目标,丢失目标后应该能返回原来位置,实现这一功能。 2.操作实现: 1.思路:利用clear value函数,禁用掉当前的追踪功能,执行之后的返…...

Linux quotacheck命令教程:如何检查和修复文件系统的磁盘配额(附案例详解和注意事项)
Linux quotacheck命令介绍 quotacheck命令是用于扫描文件系统以检查磁盘配额的一致性。它生成、检查和修复配额文件。这个命令通常在系统引导时运行,或者在手动更改了配额设置后运行。 Linux quotacheck命令适用的Linux版本 quotacheck命令在大多数Linux发行版中…...

Response对象的学习
Response对象在Web开发中是一个重要的概念,它代表了服务器对客户端请求的响应。当客户端(如浏览器)向服务器发送一个请求后,服务器会生成一个Response对象,其中包含了服务器返回给客户端的数据、状态码、响应头等信息。…...

QCustomplot---动态图
QCustomplot绘制动态曲线图-游标及鼠标跟踪显示数值_qcustomplot 游标-CSDN博客 m_timer new QTimer(this);connect(m_timer,SIGNAL(timeout()),this,SLOT(slotTimeout()));m_timer->start(50); void MainWindow::slotTimeout() {static int p0;static int i0;double m,m1…...