当前位置: 首页 > news >正文

图论之dfs与bfs的练习

dfs--深度优选搜索

bfs--广度优先搜索

迷宫问题--dfs

问题:

给定一个n*m的二维迷宫数组其中S是起点,T是终点,*是墙壁(无法通过), .是道路
问从起点S出发沿着上下左右四个方向走,能否走到T点?能输出"YES",否则输出"NO"。


8 8


*****...
*.S...**
*****.**
*****..*
*T..**.*
.**.**.*
..*....*
...*****

#include<iostream>
using namespace std;
const int N = 1e4 + 10;
char g[N][N];//迷宫数组
bool vis[N][N];//二维标记数组
//方向数组
int dx[] = { 0,0,-1,1 };
int dy[] = { 1,-1,0,0 };
int n, m;
int sx, sy, tx, ty;
bool flag;
void dfs(int px, int py) {//如果当前搜的点p是终点点t,终止搜索if (px == tx && py == ty) {flag = true;return;}//沿着点p的邻接点继续搜索for (int i = 0; i < 4; i++) {int bx=px+dx[i], by=py+dy[i];//生成邻接点if (bx<1 || bx>n || by<1 || by>m) continue;//迷宫图的边界if (g[bx][by] == '*') continue;//墙壁if (vis[bx][by]) continue;//走过的不再走vis[bx][by] = 1;dfs(bx, by);}
}
int main() {cin >> n >> m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> g[i][j];if (g[i][j] == 'S') sx = i, sy = j;//找到起点的坐标if (g[i][j] == 'T') tx = i, ty = j;//找到终点的坐标}}vis[sx][sy] = 1;flag = false;dfs(sx, sy);if (flag) cout << "YES" << endl;else cout << "NO" << endl;return 0;
}

求迷宫问题的最短路--bfs

问题:

给定一个n*m的二维迷宫数组其中S是起点,T是终点,*是墙壁(无法通过), .是道路
问从起点S出发沿着上下左右四个方向走,能否走到T点?如果能打印最短路径长度,否则输出0。


8 8


*****...
*.S...**
*****.**
*****..*
*T..**.*
.**.**.*
..*....*
...*****

#include<iostream>
#include<queue>
using namespace std;
const int N = 1e4 + 10;
char g[N][N];//迷宫数组
bool vis[N][N];//二维标记数组
//方向数组
int dx[] = { 0,0,-1,1 };
int dy[] = { 1,-1,0,0 };
int n, m;
int sx, sy, tx, ty;
struct point {int x, y, depth;
};
void bfs(point s) {queue<point> q;q.push(s);   vis[s.x][s.y] = 1;while (!q.empty()) {point cur = q.front();  q.pop();if (cur.x == tx && cur.y == ty) {flag = true;cout << cur.depth - 1 << endl;return;}//通过方向数组找到cur的邻接点,沿着邻接点继续广搜for (int i = 0; i < 4; i++) {int bx = cur.x + dx[i], by = cur.y + dy[i];//生成邻接点if (bx<1 || bx>n || by<1 || by>m) continue;if (g[bx][by] == '*') continue;if (vis[bx][by]) continue;vis[bx][by] = 1;q.push({ bx,by,cur.depth + 1 });}}
}
int main() {cin >> n >> m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> g[i][j];if (g[i][j] == 'S') sx = i, sy = j;if (g[i][j] == 'T') tx = i, ty = j;}}vis[sx][sy] = 1;flag = false;bfs({ sx, sy ,1});return 0;
}

1215:迷宫

 

信息学奥赛一本通(C++版)在线评测系统

【题目描述】

一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n×n�×�的格点组成,每个格点只有22种状态,.#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#),则看成无法办到。

【输入】

第1行是测试数据的组数k�,后面跟着k�组输入。每组测试数据的第11行是一个正整数n(1≤n≤100)�(1≤�≤100),表示迷宫的规模是n×n�×�的。接下来是一个n×n�×�的矩阵,矩阵中的元素为.或者#。再接下来一行是44个整数ha,la,hb,lbℎ�,��,ℎ�,��,描述A处在第haℎ�行, 第la��列,B处在第hbℎ�行, 第lb��列。注意到ha,la,hb,lbℎ�,��,ℎ�,��全部是从00开始计数的。

【输出】

k�行,每行输出对应一个输入。能办到则输出“YES”,否则输出“NO”。

【输入样例】

2
3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0

【输出样例】

YES
NO
解法一:dfs
#include<iostream>
using namespace std;
const int N = 1e2 + 10;
char g[N][N];//迷宫数组
bool vis[N][N];//标记数组
int t,n, sx, sy, tx, ty;
//方向数组
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
bool flag;
void dfs(int px, int py) {if (px == tx && py == ty) {flag = true;return;}//沿着邻接点继续搜索for (int i = 0; i < 4; i++) {int bx = px + dx[i], by = py + dy[i];if (bx<1 || bx>n || by<1 || by>n) continue;if (g[bx][by] == '#') continue;if (vis[bx][by]) continue;//如果以上情况均不成立,证明邻接点有效,沿着该邻接点继续深搜vis[bx][by] = 1;//不标记会报栈溢出错误dfs(bx, by);}
}
int main() {cin >> t;while (t--) {cin >> n;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)cin >> g[i][j];  cin >> sx >> sy >> tx >> ty;sx++, sy++, tx++, ty++;//注意:本题下标从0开始//多组数据要将相关状态重置flag = false;memset(vis, 0, sizeof vis);//将vis数组全体清0vis[sx][sy] = 1;dfs(sx, sy);if (flag) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}
 解法二:bfs
#include<iostream>
#include<queue>
using namespace std;
const int N = 1e2 + 10;
char g[N][N];//迷宫数组
bool vis[N][N];//标记数组
int t, n, sx, sy, tx, ty;
//方向数组
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
bool flag;
struct point {int x, y;
};
void bfs(point p) {queue<point> q;q.push(p);  vis[p.x][p.y] = 1;while (!q.empty()) {point cur=q.front();  q.pop();if (cur.x == tx && cur.y== ty) {flag = true;return;}//沿着邻接点继续搜索for (int i = 0; i < 4; i++) {int bx = cur.x + dx[i], by = cur.y + dy[i];if (bx<1 || bx>n || by<1 || by>n) continue;if (g[bx][by] == '#') continue;if (vis[bx][by]) continue;//如果以上情况均不成立,证明邻接点有效,沿着该邻接点继续深搜vis[bx][by] = 1;q.push({ bx,by });}}
}
int main() {cin >> t;while (t--) {cin >> n;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)cin >> g[i][j];   /*scanf(" %c", &g[i][j]); */cin >> sx >> sy >> tx >> ty;sx++, sy++, tx++, ty++;//注意本题下标从0开始//多组数据要将相关状态重置flag = false;memset(vis, 0, sizeof vis);//将vis数组全体清0vis[sx][sy] = 1;bfs({sx, sy});if (flag) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}

1216:红与黑

【题目描述】

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

【输入】

包括多组数据。每组数据的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下:

1)‘.’:黑色的瓷砖;

2)‘#’:红色的瓷砖;

3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每组数据中唯一出现一次。

当在一行中读入的是两个零时,表示输入结束。

【输出】

对每组数据,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

【输入样例】

6 9 
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
0 0

【输出样例】

45
解法一:dfs
#include<iostream>
using namespace std;
const int N = 1e2 + 10;
char g[N][N];//迷宫数组
bool vis[N][N];//二维标记数组
//方向数组
int dx[] = { 0,0,-1,1 };
int dy[] = { 1,-1,0,0 };
int sx, sy;
int w, h;
int cnt;
void dfs(int px,int py)
{//沿着邻接点搜索for (int i = 0; i < 4; i++){int bx = px + dx[i], by = py + dy[i];if (g[bx][by] == '#')continue;if (bx<1 || bx>w || by<1 || by>h)continue;if (vis[bx][by])continue;vis[bx][by] = 1;cnt++;dfs(bx, by);}
}int main()
{/*注意:本题是先输入列再输入行*/while (cin >> h >> w && w && h)//注意要判断w和h都为0结束{for (int i = 1; i <= w; i++){for (int j = 1; j <= h; j++){cin >> g[i][j];if (g[i][j] == '@')sx = i, sy = j;}}//多组数据注意相关状态cnt = 1;memset(vis, 0, sizeof vis);//vis数组全体清0vis[sx][sy] = 1;dfs(sx, sy);cout << cnt << endl;}return 0;
}
 解法二:bfs
#include<iostream>
#include<queue>
using namespace std;
const int N = 1e2 + 10;
char g[N][N];//迷宫数组
bool vis[N][N];//二维标记数组
//方向数组
int dx[] = { 0,0,-1,1 };
int dy[] = { 1,-1,0,0 };
int sx, sy;
int w, h;
int cnt;
struct point
{int x, y;
};
void dfs(point s)
{queue<point>q;q.push(s); vis[s.x][s.y] = 1;while (!q.empty()) {point cur = q.front(); q.pop();//沿着邻接点搜索for (int i = 0; i < 4; i++){int bx = cur.x + dx[i], by = cur.y + dy[i];if (g[bx][by] == '#')continue;if (bx<1 || bx>w || by<1 || by>h)continue;if (vis[bx][by])continue;vis[bx][by] = 1;cnt++;q.push({bx,by});}}
}int main()
{/*注意:本题是先输入列再输入行*/while (cin >> h >> w && w && h)//注意要判断w和h都为0结束{for (int i = 1; i <= w; i++){for (int j = 1; j <= h; j++){cin >> g[i][j];if (g[i][j] == '@')sx = i, sy = j;}}//多组数据注意相关状态cnt = 1;memset(vis, 0, sizeof vis);//vis数组全体清0vis[sx][sy] = 1;dfs({ sx, sy });cout << cnt << endl;}return 0;
}

1219:马走日--dfs

注意:本题需要用到回溯算法,故只能用深度优先搜索

【题目描述】

马在中国象棋以日字形规则移动。

请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。

【输入】

第一行为整数T(T < 10),表示测试数据组数。

每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y。(0≤x≤n-1,0≤y≤m-1, m < 10, n < 10)。

【输出】

每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次。

【输入样例】

1
5 4 0 0

【输出样例】

32
#include<iostream>
using namespace std;
const int N = 1e2 + 10;
int g[N][N];//迷宫数组
bool vis[N][N];//二维标记数组
//方向数组--八个方向
int dx[] = { 1,1,-1,-1,2,2,-2,-2 };
int dy[] = { 2,-2,2,-2,1,-1,1,-1};
int t; int n, m,sx,sy;
int cnt;
void dfs(int px, int py, int depth)
{if (depth == n * m)//按照此时的搜索方案已经搜完整个棋盘了{cnt++;return;}for (int i = 0; i < 8; i++)/*注意:八个方向*/{int bx = px + dx[i], by = py + dy[i];if (vis[bx][by])continue;if (bx<1 || bx>n || by<1 || by>m)continue;vis[bx][by] = 1;dfs(bx, by,depth+1);//回溯vis[bx][by] = 0;}}
int main()
{cin >> t;while (t--){cin >> n >> m;//多组数据相关状态清空cnt =0;cin >> sx >> sy;sx++, sy++;memset(vis, 0, sizeof vis);vis[sx][sy] = 1;dfs(sx, sy,1);//起点是第一层,最后应该走到n*m层结束cout << cnt << endl;}return 0;
}

 1212:LETTERS--dfs

【题目描述】

给出一个row×col���×���的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。

【输入】

第一行,输入字母矩阵行数R�和列数S�,1≤R,S≤201≤�,�≤20。

接着输出R�行S�列字母矩阵。

【输出】

最多能走过的不同字母的个数。

【输入样例】

3 6
HFDFFB
AJHGDH
DGAGEH

【输出样例】

6
#include<iostream>
using namespace std;
char g[N][N];
bool vis[N];
int dx[] = { 1,-1,0,0};
int dy[] = { 0,0,1,-1};
int n, m;
int ans = 0;
void dfs(int px,int py,int depth)
{ans = max(ans, depth);//选取经过字母数最多的for (int i = 0; i < 4; i++){int bx = px + dx[i], by = py + dy[i];if (vis[g[bx][by]])continue;if (bx<1 || bx>n || by<1 || by>m) continue;vis[g[bx][by]] = 1;dfs(bx, by, depth + 1);vis[g[bx][by]] =0;//回溯}
}
int main()
{cin >> n >> m;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> g[i][j];}}vis[g[1][1]] = 1;dfs(1,1,1);cout << ans;return 0;
}

求最短路径

1251:仙岛求药--bfs

【题目描述】

少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由M×N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。

下图 显示了一个迷阵的样例及李逍遥找到仙药的路线。

【输入】

输入有多组测试数据. 每组测试数据以两个非零整数 M 和 N 开始,两者均不大于20。M 表示迷阵行数, N 表示迷阵列数。接下来有 M 行, 每行包含N个字符,不同字符分别代表不同含义:

1)‘@’:少年李逍遥所在的位置;

2)‘.’:可以安全通行的方格;

3)‘#’:有怪物的方格;

4)‘*’:仙药所在位置。

当在一行中读入的是两个零时,表示输入结束。

【输出】

对于每组测试数据,分别输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1。

【输入样例】

8 8
.@##...#
#....#.#
#.#.##..
..#.###.
#.#...#.
..###.#.
...#.*..
.#...###
6 5
.*.#.
.#...
..##.
.....
.#...
....@
9 6.#..#.
.#.*.#
.####.
..#...
..#...
..#...
..#...
#.@.##
.#..#.
0 0

【输出样例】

10
8
-1

#include<iostream>
#include<queue>
using namespace std;
const int N = 1e2 + 10;
int n, m,sx,sy,tx,ty;
char g[N][N];
bool vis[N][N];
int ans = -1;
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
struct point { int x, y, depth; };
void bfs(point p) {queue<point> q;q.push(p);  vis[p.x][p.y] = 1;while (!q.empty()) {point cur = q.front(); q.pop();if (cur.x == tx && cur.y == ty) {ans= cur.depth - 1;return;}for (int i = 0; i < 4; i++) {int bx = cur.x + dx[i], by = cur.y + dy[i];if (bx<1 || bx>n || by<1 || by>m) continue;if (vis[bx][by]) continue;if (g[bx][by] == '#') continue;vis[bx][by] = 1;q.push({ bx,by,cur.depth + 1 });}}
}
int main() {while (cin >> n >> m && n && m) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> g[i][j];if (g[i][j] == '@') sx = i, sy = j;if (g[i][j] == '*') tx = i, ty = j;}}ans = -1;memset(vis, 0, sizeof vis);bfs({ sx,sy,1 });cout << ans << endl;}return 0;
}

1330:【例8.3】最少步数--bfs

【题目描述】

在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试,在一个(100×100)的围棋盘上任选两点A、B,A点放上黑子,B点放上白子,代表两匹马。棋子可以按“日”字走,也可以按“田”字走,俩人一个走黑马,一个走白马。谁用最少的步数走到左上角坐标为(1,1)的点时,谁获胜。现在他请你帮忙,给你A、B两点的坐标,想知道两个位置到(1,1)点可能的最少步数。

【输入】

A、B两点的坐标。

【输出】

最少步数。

【输入样例】

12 16
18 10

【输出样例】

8
9
#include<iostream>
#include<queue>
const int N = 1e2 + 10;
char g[N][N];
bool vis[N][N];
int dx[] = {1,1,-1,-1,2,2,-2,-2,2,2,-2,-2};
int dy[] = {2,-2,2,-2,1,-1,1,-1,2,-2,2,-2};
int n, m;
int sx, sy;
int ans;
struct point
{int x, y,depth;
};
void bfs(point s)
{queue<point>q;q.push(s); vis[s.x][s.y] = 1;while (!q.empty()){point cur = q.front(); q.pop();if (cur.x == 1 && cur.y == 1){ans=cur.depth - 1 ;return;}for (int i = 0; i < 12; i++){int bx = cur.x + dx[i], by = cur.y + dy[i];if (bx<1 || bx>100 || by<1 || by>100)continue;if (vis[bx][by])continue;//注意,搜索时也不能搜0vis[bx][by] = 1;q.push({ bx, by,cur.depth+1});}}
}int main()
{int t = 2;while (t--){ans = 0;cin >> sx>>sy;memset(vis, 0, sizeof vis);bfs({ sx, sy ,1});cout << ans<<endl;}return 0;
}

1255:迷宫问题--bfs

【题目描述】

定义一个二维数组:

int maze[5][5] = {
0,1,0,0,0,
0,1,0,1,0,
0,0,0,0,0,
0,1,1,1,0,
0,0,0,1,0,
};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

【输入】

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

【输出】

左上角到右下角的最短路径,格式如样例所示。

【输入样例】

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

【输出样例】

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

  

#include<iostream>
#include<queue>
using namespace std;
const int N = 1e2 + 10;
char g[N][N];
bool vis[N][N];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
struct point
{int x, y;
};
point path[N][N];
void bfs(point s)
{queue<point>q;q.push(s); vis[s.x][s.y] = 1;while (!q.empty()){point cur = q.front(); q.pop();if (cur.x == 5 && cur.y == 5)return;for (int i = 0; i < 4; i++){int bx = cur.x + dx[i], by = cur.y + dy[i];if (bx < 1 || bx>5 || by < 1 || by>5)continue;if (g[bx][by] == '1')continue;if (vis[bx][by])continue;vis[bx][by] = 1;path[bx][by] = cur;q.push({bx, by});}}
}
void print(int px,int py)
{if (px == 0 && py == 0)return;print(path[px][py].x, path[px][py].y);printf("(%d, %d)\n", px-1, py-1);
}
int main()
{for (int i = 1; i <= 5; i++)for (int j = 1; j <= 5; j++)cin >> g[i][j];bfs({1,1});print(5,5);return 0;
}

1257:Knight Moves

【题目描述】

输入n�代表有个n×n�×�的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步。

【输入】

首先输入一个n�,表示测试样例的个数。

每个测试样例有三行。

第一行是棋盘的大小L(4≤L≤300)�(4≤�≤300);

第二行和第三行分别表示马的起始位置和目标位置(0..L−1)(0..�−1)。

【输出】

马移动的最小步数,起始位置和目标位置相同时输出00。

【输入样例】

3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1

【输出样例】

5
28
0
#include<iostream>
#include<queue>
//#include<Windows.h>//动画演示
using namespace std;
const int N = 3e2 + 10;
char g[N][N];
bool vis[N][N];
int dx[] = {1,1,2,2,-1,-1,-2,-2};
int dy[] = {2,-2,1,-1,2,-2,1,-1};
int t;
int n,sx, sy, tx, ty;
int ans;
struct point { int x; int y; int depth; };
void dfs(point s)
{queue<point>q;q.push(s); vis[s.x][s.y] = 1;while (!q.empty()){point cur = q.front(); q.pop();if (cur.x == tx && cur.y == ty){ans = cur.depth-1;return;}for (int i = 0; i < 8; i++){int bx = cur.x + dx[i], by = cur.y + dy[i];if (bx<1 || bx> n || by<1 || by>n) continue;if (vis[bx][by]) continue;vis[bx][by] = 1;q.push({ bx, by,cur.depth+1 });}}}int main()
{cin >> t;while (t--){cin >> n;cin >> sx >> sy >> tx >> ty;sx++, sy++,tx++, ty++;ans = 0;memset(vis, 0, sizeof vis);dfs({ sx, sy,1 });cout << ans<<endl;}return 0;
}

相关文章:

图论之dfs与bfs的练习

dfs--深度优选搜索 bfs--广度优先搜索 迷宫问题--dfs 问题&#xff1a; 给定一个n*m的二维迷宫数组其中S是起点&#xff0c;T是终点&#xff0c;*是墙壁&#xff08;无法通过&#xff09;&#xff0c; .是道路 问从起点S出发沿着上下左右四个方向走&#xff0c;能否走到T点&a…...

Vue练习5:图片的引入

后续会补充 1.require引入 src -> asstes <template><img :src"url"> </template><script> export default {name: App,data(){return{url: require("./assets/logo.png"),}} } </script> 2.import引入 src…...

SpringBoot+Kafka

文章目录 一、依赖二、配置文件三、API1、生产者2、消费者 一、依赖 <!-- spring-kafka&#xff08;与kafka的版本一致&#xff09; --> <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId>…...

世界顶级名校计算机专业,都在用哪些书当教材?(文末送书)

目录 01《深入理解计算机系统》02《算法导论》03《计算机程序的构造和解释》04《数据库系统概念》05《计算机组成与设计&#xff1a;硬件/软件接口》06《离散数学及其应用》07《组合数学》08《斯坦福算法博弈论二十讲》参与规则 清华、北大、MIT、CMU、斯坦福的学霸们在新学期里…...

蓝桥杯刷题--python-8(2023 填空题)

0幸运数 - 蓝桥云课 (lanqiao.cn) res=0 for i in range (1,100000000):l_n=[]for j in str(i):l_n.append(int(j))if len(l_n) % 2 ==0:cur =len(l_n)>>1if sum(l_n[:cur])==sum(l_n[cur:]):res+=1 print(res) 0有奖问答 - 蓝桥云课 (lanqiao.cn) dfs def bfs(score, q…...

Eclipse - Reset Perspective

Eclipse - Reset Perspective 1. Window -> Perspective -> Reset Perspective2. Reset Perspective -> YesReferences 1. Window -> Perspective -> Reset Perspective 2. Reset Perspective -> Yes ​​​ References [1] Yongqiang Cheng, https://yo…...

1.5v的电池电压低于多少v等于没电

对于1.5V的电池&#xff0c;电压低于一定值时就不再适合使用了。具体的电压值取决于电池的类型和使用设备的需求。一般来说&#xff0c; 对于接收设备&#xff08;如收音机、BB机、遥控机等&#xff09;&#xff0c;每节电池电压一般到1.2V以下就认为没电了。有些电动玩具、剃…...

LabVIEW智能监测系统

LabVIEW智能监测系统 设计与实现一个基于LabVIEW的智能监测系统&#xff0c;通过高效的数据采集和处理能力&#xff0c;提高监测精度和响应速度。系统通过集成传感器技术与虚拟仪器软件&#xff0c;实现对环境参数的实时监测与分析&#xff0c;进而优化监控过程&#xff0c;提…...

代码随想录刷题第34天

第一题是柠檬水找零https://leetcode.cn/problems/lemonade-change/&#xff0c;感觉并没有特别靠近贪心算法&#xff0c;可供讨论的情况非常少&#xff0c;5元收下&#xff0c;10元返5元&#xff0c;20元返15元&#xff0c;对各种找零情况讨论一下即可。 class Solution { pu…...

AMD FPGA设计优化宝典笔记(5)低频全局复位与高扇出

亚军老师的这本书《AMD FPGA设计优化宝典》&#xff0c;他主要讲了两个东西&#xff1a; 第一个东西是代码的良好风格&#xff1b; 第二个是设计收敛等的本质。 这个书的结构是一个总论&#xff0c;加上另外的9个优化&#xff0c;包含的有&#xff1a;时钟网络、组合逻辑、触发…...

14. Qt 程序菜单实现,基于QMainWindow

目录 前言&#xff1a; 技能&#xff1a; 内容&#xff1a; 一、ui中直接添加控件实现 二、 完全通过代码实现菜单 参考&#xff1a; 前言&#xff1a; 基于QMainWindow&#xff0c;两种方式实现菜单&#xff1a;通过直接添加ui控件快速添加菜单和完全通过代码实现菜单&a…...

如何利用SpringSecurity进行认证与授权

目录 一、SpringSecurity简介 1.1 入门Demo 二、认证 ​编辑 2.1 SpringSecurity完整流程 2.2 认证流程详解 2.3 自定义认证实现 2.3.1 数据库校验用户 2.3.2 密码加密存储 2.3.3 登录接口实现 2.3.4 认证过滤器 2.3.5 退出登录 三、授权 3.1 权限系统作用 3.2 授…...

如何简单上手清华AutoGPT并搭建到本地环境

一、准备工作 安装Docker&#xff1a;确保你的本地机器上已经安装了Docker。如果还没有安装&#xff0c;请访问Docker官方网站并按照指引进行安装。--点击进入Docker官网 获取清华AutoGPT的Docker镜像&#xff1a;清华AutoGPT团队可能已经提供了一个Docker镜像&#xff0c;方便…...

【漏洞复现-通达OA】通达OA share存在前台SQL注入漏洞

一、漏洞简介 通达OA&#xff08;Office Anywhere网络智能办公系统&#xff09;是由北京通达信科科技有限公司自主研发的协同办公自动化软件&#xff0c;是与中国企业管理实践相结合形成的综合管理办公平台。通达OA为各行业不同规模的众多用户提供信息化管理能力&#xff0c;包…...

HTML5 Canvas与JavaScript携手绘制动态星空背景

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>星空背景</title> </head> <body style"overflow-x:hidden;"><canvas …...

如何优雅地与ChatGPT对话?

ChatGPT已经发布了一年之久了&#xff0c;但你真的会使用ChatGPT吗&#xff1f;同一个问题&#xff0c;不同的问法得到的答案可能千差万别&#xff0c;你可以把ChatGPT当作一个知识面很广的专家&#xff0c;他上知天文下知地理&#xff0c;但他无法直接知道你的意图&#xff0c…...

AI提示工程实战:从零开始利用提示工程学习应用大语言模型【文末送书-19】

文章目录 背景什么是提示工程&#xff1f;从零开始&#xff1a;准备工作设计提示调用大语言模型 实际应用示例文字创作助手代码生成持续优化与迭代数据隐私与安全性可解释性与透明度总结 AI提示工程实战&#xff1a;从零开始利用提示工程学习应用大语言模型【文末送书-19】⛳粉…...

量子算法入门——3.狄拉克符号与量子态(3)

3. 狄拉克符号的数学基础 左矢是右矢的共轭转置 上标*表示共轭 算符就是对狄拉克符号进行操作&#xff0c;就是相当于矩阵操作向量&#xff0c;算符对应本征值和本征态 本征值&#xff1a;拉伸x、y向量的程度本征态&#xff1a;x、y向量 上标匕首&#x1f5e1;符号&#xf…...

c++ STL系列——(三)list

目录 引言 list的特点 list的用法 list与其他容器的比较 结论 引言 在C STL中&#xff0c;list 是一个非常灵活且功能强大的双向链表容器&#xff0c;它允许存储任意类型的元素&#xff0c;并提供了丰富的操作函数&#xff0c;包括插入、删除、排序、查找以及对容器的遍历…...

软考29-上午题-排序

一、排序的基本概念 1-1、稳定性 稳定性指的是相同的数据所在的位置经过排序后是否发生变化。若是排序后&#xff0c;次序不变&#xff0c;则是稳定的。 1-2、归位 每一趟排序能确定一个元素的最终位置。 1-3、内部排序 排序记录全部存放在内存中进行排序的过程。 1-4、外部…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...