2.1.1BFS中的Flood Fill和最短路模型

news2024/10/7 2:19:11

1.池塘计数

农夫约翰有一片 N ∗ M N∗M NM 的矩形土地。

最近,由于降雨的原因,部分土地被水淹没了。

现在用一个字符矩阵来表示他的土地。

每个单元格内,如果包含雨水,则用”W”表示,如果不含雨水,则用”.”表示。

现在,约翰想知道他的土地中形成了多少片池塘。

每组相连的积水单元格集合可以看作是一片池塘。

每个单元格视为与其上、下、左、右、左上、右上、左下、右下八个邻近单元格相连。

请你输出共有多少片池塘,即矩阵中共有多少片相连的”W”块。

输入格式
第一行包含两个整数 N N N M M M

接下来 N N N行,每行包含 M M M个字符,字符为”W”或”.”,用以表示矩形土地的积水状况,字符之间没有空格。

输出格式
输出一个整数,表示池塘数目。

数据范围
1 ≤ N , M ≤ 1000 1≤N,M≤1000 1N,M1000

输入样例:

10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.

输出样例:

3
1.1题解

在这里插入图片描述

在这里插入图片描述
bfs

遍历单元格,同时用一个标记数组记录(标记)每个单元格是否被访问过。

在遍历单元格过程中,如果当前单元格是水,并且没有被访问过,水域数量+1,并且对该单元格进行bfs。

bfs 函数:从当前单元格开始,访问并标记和他同一片水域的单元格。

1.2代码实现
#include<iostream>
#include<algorithm>
#include<cstring>

#define x first
#define y second

using namespace std;

//储存下标
typedef pair<int,int> PII;
const int N = 1010,M = N * N;

int n,m;
char g[N][N];
PII q[M];
bool st[N][N]; //判重数组

void bfs(int sx,int sy)
{
    //模拟队列
    int hh = 0,tt = 0;
    q[0] = {sx,sy};
    st[sx][sy] = true;
    
    while(hh <= tt)
    {
        PII t = q[hh++];//取出队头
        //判断8连通,一般使用双重循环
        for(int i = t.x - 1;i <= t.x + 1;i++)
            for(int j = t.y - 1;j <= t.y + 1;j++)
            {
                if(i == t.x && j == t.y)    continue;
                if(i < 0 || i >= n || j < 0 || j >= m)  continue;
                if(g[i][j] == '.' || st[i][j])  continue;
                
                q[++ tt] = {i,j};
                st[i][j] = true;
            }
    }
}


int main()
{
    scanf("%d%d",&n,&m);
    for(int i = 0;i < n;i++)    scanf("%s",g[i]);
    
    int cnt = 0;
    for(int i = 0;i < n;i++)    
        for(int j = 0;j < m;j++)
            if(g[i][j] == 'W' && !st[i][j])
            {
                bfs(i,j);
                cnt++;
            }
    
    printf("%d",cnt);
    
    return 0;
}

2.城堡问题

在这里插入图片描述
图1是一个城堡的地形图。

请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。

城堡被分割成 m ∗ n m∗n mn个方格区域,每个方格区域可以有 0   4 0~4 0 4面墙。

注意:墙体厚度忽略不计。

输入格式
第一行包含两个整数 m m m n n n,分别表示城堡南北方向的长度和东西方向的长度。

接下来 m m m 行,每行包含 n n n个整数,每个整数都表示平面图对应位置的方块的墙的特征。

每个方块中墙的特征由数字 P P P来描述,我们用 1 1 1表示西墙, 2 2 2表示北墙, 4 4 4表示东墙, 8 8 8表示南墙, P P P为该方块包含墙的数字之和。

例如,如果一个方块的 P P P 3 3 3,则 3 = 1 + 2 3 = 1 + 2 3=1+2,该方块包含西墙和北墙。

城堡的内墙被计算两次,方块 ( 1 , 1 ) (1,1) (1,1)的南墙同时也是方块 ( 2 , 1 ) (2,1) (2,1)的北墙。

输入的数据保证城堡至少有两个房间。

输出格式
共两行,第一行输出房间总数,第二行输出最大房间的面积(方块数)。

数据范围
1 ≤ m , n ≤ 50 , 1≤m,n≤50, 1m,n50,
0 ≤ P ≤ 15 0≤P≤15 0P15
输入样例:

4 7 
11 6 11 6 3 10 6 
7 9 6 13 5 15 5 
1 10 12 7 13 7 5 
13 11 10 8 10 12 13 

输出样例:

5
9
2.1题解

在这里插入图片描述
在这里插入图片描述
不过本题中:
西墙表示:1,北墙表示:2,东墙表示:4,南墙表示:8
可以看出依次是 2 0 , 2 1 , 2 2 , 2 3 2^{0},2^{1},2^{2},2^{3} 20,21,22,23
所以可以用二进制来表示墙的分布情况.
例如: ( 0101 ) 2 (0101)_{2} (0101)2表示南,北边无墙,东,西边有墙

2.2代码实现
#include<iostream>
#include<algorithm>
#include<cstring>

#define x first
#define y second

using namespace std;

typedef pair<int,int> PII;

const int N = 55,M = N * N;

int n,m;
int g[N][N];
PII q[M];
bool st[N][N];

int bfs(int sx,int sy)
{
    //标记一下方向
    int dx[4] = {0,-1,0,1},dy[4] = {-1,0,1,0};
    
    int hh = 0,tt = 0;
    int area = 0;
    q[0] = {sx,sy};
    st[sx][sy] = true;
    
    while(hh <= tt)
    {
        PII t = q[hh++];
        area++;
        //遍历四个方向
        for(int i = 0; i < 4;i++)
        {
            int a = t.x + dx[i],b = t.y + dy[i];
            if(a < 0 || a >= n || b < 0 || b >= m)  continue;
            if(st[a][b])    continue;
            if(g[t.x][t.y] >> i & 1)    continue;
            
            q[++ tt] = {a,b};
            st[a][b] = true;
        }
    }
    
    return area;
}

int main()
{
    cin >> n >> m;
    for(int i = 0;i < n;i++)
        for(int j = 0;j < m;j++)
            cin >> g[i][j];
            
    int cnt = 0,area = 0;
    for(int i = 0;i < n;i++)
        for(int j = 0;j < m;j++)
            if(!st[i][j])
            {
                area = max(area,bfs(i,j));
                cnt++;
            }
            
    cout << cnt << endl;
    cout << area << endl;
    return 0;
}

3.山峰和山谷

FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷。

为了能够对旅程有一个安排,他想知道山峰和山谷的数量。

给定一个地图,为FGD想要旅行的区域,地图被分为 n × n n×n n×n的网格,每个格子 ( i , j ) (i,j) (i,j) 的高度 w ( i , j ) w(i,j) w(i,j)是给定的。

若两个格子有公共顶点,那么它们就是相邻的格子,如与 ( i , j ) (i,j) (i,j)相邻的格子有 ( i − 1 , j − 1 ) , ( i − 1 , j ) , ( i − 1 , j + 1 ) , ( i , j − 1 ) , ( i , j + 1 ) , ( i + 1 , j − 1 ) , ( i + 1 , j ) , ( i + 1 , j + 1 ) (i−1,j−1),(i−1,j),(i−1,j+1),(i,j−1),(i,j+1),(i+1,j−1),(i+1,j),(i+1,j+1) (i1,j1),(i1,j),(i1,j+1),(i,j1),(i,j+1),(i+1,j1),(i+1,j),(i+1,j+1)

我们定义一个格子的集合 S S S为山峰(山谷)当且仅当:

  1. S S S 的所有格子都有相同的高度。
  2. S S S的所有格子都连通。
  3. 对于 s s s属于 S S S,与 s s s相邻的 s ′ s^{'} s不属于 S S S,都有 w s > w s ′ w_{s}>w_{s^{'}} ws>ws(山峰),或者 w s < w s ′ w_{s}<w_{s^{'}} ws<ws(山谷)。
  4. 如果周围不存在相邻区域,则同时将其视为山峰和山谷。

你的任务是,对于给定的地图,求出山峰和山谷的数量,如果所有格子都有相同的高度,那么整个地图即是山峰,又是山谷。

输入格式
第一行包含一个正整数 n n n,表示地图的大小。

接下来一个 n × n n×n n×n 的矩阵,表示地图上每个格子的高度 w w w

输出格式
共一行,包含两个整数,表示山峰和山谷的数量。

数据范围
1 ≤ n ≤ 1000 , 1≤n≤1000, 1n1000,
0 ≤ w ≤ 1 0 9 0≤w≤10^{9} 0w109

输入样例1:

5
8 8 8 7 7
7 7 8 8 7
7 7 7 7 7
7 8 8 7 8
7 8 8 8 8

输出样例1:

2 1

输入样例2:

5
5 7 8 3 1
5 5 7 6 6
6 6 6 2 8
5 7 2 5 8
7 1 0 1 7

输出样例2:

3 3

样例解释
样例1:
1.png

样例2:

2.png
3.1题解

在这里插入图片描述

3.2代码
#include<cstring>
#include<iostream>
#include<algorithm>

#define x first
#define y second

using namespace std;

typedef pair<int,int> PII;

const int N = 1010,M = N * N;

int n;
int h[N][N];
PII q[M];
bool st[N][N];


//引用,在此传进去的参数是引用
void bfs(int sx,int sy,bool& has_higher,bool& has_lower)
{
    int hh = 0,tt = 0;
    q[0] = {sx,sy};
    st[sx][sy] = true;
    
    while(hh <= tt)
    {
        PII t = q[hh++];
        //八连接,使用双重循环
        for(int i = t.x - 1;i <= t.x + 1;i++)
            for(int j = t.y - 1;j <= t.y + 1;j++)
            {
                if(i == t.x && j == t.y) continue;//把中间格子扣掉
                if(i < 0 || i >= n || j < 0 || j >= n)  continue;
                if(h[i][j] != h[t.x][t.y])  //山脉的边界
                {
                    if(h[i][j] > h[t.x][t.y])   has_higher = true;
                    else has_lower = true;
                }
                else if(!st[i][j])
                {
                    q[++ tt] = {i,j};
                    st[i][j] = true;
                }
            }
    }
}
int main()
{
    scanf("%d",&n);
    
    for(int i = 0;i < n;i++)
        for(int j = 0;j < n;j++)
            scanf("%d",&h[i][j]);
            
    int peak = 0,valley = 0;
    for(int i = 0;i < n;i++)
        for(int j = 0;j < n;j++)
            if(!st[i][j])
            {
                bool has_higher = false,has_lower = false;
                //使用传引用的方式
                bfs(i,j,has_higher,has_lower);
                if(!has_higher) peak++;
                //注意在此不能单纯的使用else,因为有可能即是山峰又是山谷
                if(!has_lower)  valley++;
            }
            
    printf("%d %d\n",peak,valley);
    
    return 0;
}

4.迷宫问题

给定一个 n × n n×n n×n 的二维数组,如下所示:

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 1 1表示墙壁, 0 0 0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

数据保证至少存在一条从左上角走到右下角的路径。

输入格式
第一行包含整数 n n n

接下来 n n n行,每行包含 n n n个整数 0 0 0 1 1 1,表示迷宫。

输出格式
输出从左上角到右下角的最短路线,如果答案不唯一,输出任意一条路径均可。

按顺序,每行输出一个路径中经过的单元格的坐标,左上角坐标为 ( 0 , 0 ) (0,0) (0,0),右下角坐标为 ( n − 1 , n − 1 ) (n−1,n−1) (n1,n1)

数据范围
0 ≤ n ≤ 1000 0≤n≤1000 0n1000
输入样例:

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
4.1题解

这道题是844题的扩展 我们这道题是想让我们将最短的路进行输出
我们的做法是用 p r e [ ] [ ] pre[][] pre[][]数组来记录当前结点前驱结点是哪个点以便我们输出它最短路径的坐标点 我们倒着寻找最短路径从 ( n − 1 , n − 1 ) (n-1,n-1) (n1,n1)开始
这样的话更新完 p r e pre pre数组 ( 0 , 0 ) (0,0) (0,0)就有它的前驱结点了 这样就能正着将 p r e pre pre数组中输出对应的路径了
关键和844的不同点就是如何维护 p r e pre pre这个记录路径的数组 以及你如何将这个数组数组也是有学问的

4.2代码
#include<cstring>
#include<algorithm>
#include<iostream>

#define x first
#define y second

using namespace std;

typedef pair<int,int> PII;

const int N = 1010,M = N * N;

int n;
int g[N][N];
PII q[M];
PII pre[N][N];  //记录路径

void bfs(int sx,int sy)
{
    //四个方向,上右下左
    int dx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1};
    int hh = 0,tt = 0;
    q[0] = {sx,sy};
    
    memset(pre,-1,sizeof pre);
    pre[sx][sy] = {0,0};
    while(hh <= tt)
    {
        PII t = q[hh ++];
        
        for(int i = 0;i < 4;i++)
        {
            int a = t.x + dx[i],b = t.y + dy[i];
            if(a < 0 || a >= n || b < 0 || b >= n)  continue;
            if(g[a][b]) continue;
            if(pre[a][b].x != -1)   continue;
            
            q[++ tt] = {a,b};
            pre[a][b] = t;
        }
    }
}
int main()
{
    scanf("%d",&n);
    
    for(int i = 0;i < n;i++)
        for(int j = 0;j < n;j++)
            scanf("%d",&g[i][j]);
    //反向搜        
    bfs(n - 1,n - 1);
    
    PII end(0,0);
    
    while(true)
    {
        printf("%d %d\n",end.x,end.y);
        if(end.x == n - 1 && end.y == n - 1)    break;
        end = pre[end.x][end.y];
    }
    
    return 0;
    
}

5.武士风度的牛

农民 J o h n John John 有很多牛,他想交易其中一头被 D o n Don Don 称为 T h e K n i g h t The Knight TheKnight 的牛。

这头牛有一个独一无二的超能力,在农场里像 K n i g h t Knight Knight 一样地跳(就是我们熟悉的象棋中马的走法)。

虽然这头神奇的牛不能跳到树上和石头上,但是它可以在牧场上随意跳,我们把牧场用一个 x , y x,y xy的坐标图来表示。

这头神奇的牛像其它牛一样喜欢吃草,给你一张地图,上面标注了 T h e K n i g h t The Knight TheKnight 的开始位置,树、灌木、石头以及其它障碍的位置,除此之外还有一捆草。

现在你的任务是,确定 T h e K n i g h t The Knight TheKnight 要想吃到草,至少需要跳多少次。

T h e K n i g h t The Knight TheKnight 的位置用 K 来标记,障碍的位置用 * 来标记,草的位置用 H 来标记。

这里有一个地图的例子:

             11 | . . . . . . . . . .
             10 | . . . . * . . . . . 
              9 | . . . . . . . . . . 
              8 | . . . * . * . . . . 
              7 | . . . . . . . * . . 
              6 | . . * . . * . . . H 
              5 | * . . . . . . . . . 
              4 | . . . * . . . * . . 
              3 | . K . . . . . . . . 
              2 | . . . * . . . . . * 
              1 | . . * . . . . * . . 
              0 ----------------------
                                    1 
                0 1 2 3 4 5 6 7 8 9 0 

T h e K n i g h t The Knight TheKnight 可以按照下图中的 A , B , C , D … A,B,C,D… A,B,C,D这条路径用 5 5 5次跳到草的地方(有可能其它路线的长度也是 5 5 5):

             11 | . . . . . . . . . .
             10 | . . . . * . . . . .
              9 | . . . . . . . . . .
              8 | . . . * . * . . . .
              7 | . . . . . . . * . .
              6 | . . * . . * . . . F<
              5 | * . B . . . . . . .
              4 | . . . * C . . * E .
              3 | .>A . . . . D . . .
              2 | . . . * . . . . . *
              1 | . . * . . . . * . .
              0 ----------------------
                                    1
                0 1 2 3 4 5 6 7 8 9 0

注意: 数据保证一定有解。

输入格式
1 1 1 行: 两个数,表示农场的列数 C C C 和行数 R R R

2.. R + 1 2..R+1 2..R+1行: 每行一个由 C C C 个字符组成的字符串,共同描绘出牧场地图。

输出格式
一个整数,表示跳跃的最小次数。

数据范围
1 ≤ R , C ≤ 150 1≤R,C≤150 1R,C150
输入样例:

10 11
..........
....*.....
..........
...*.*....
.......*..
..*..*...H
*.........
...*...*..
.K........
...*.....*
..*....*..

输出样例:

5
5.1题解

广度优先搜索
一般来说走迷宫,最少步数这种题目,都是广度优先搜索.记住读入上面的有梗,然后修改一下一般走路方式就好了.

5.2代码实现
#include<cstring>
#include<iostream>
#include<algorithm>

#define x first
#define y second

using namespace std;

typedef pair<int,int> PII;
const int N = 155,M = N * N;

int n,m;
char g[N][N];
PII q[M];
int dist[N][N];//存储最短路

int bfs()
{
    int dx[8] = {-2,-1,1,2,2,1,-1,-2};
    int dy[8] = {1,2,2,1,-1,-2,-2,-1};
    int sx,sy;
    //寻找起点
    for(int i = 0;i < n;i++)
        for(int j = 0;j < m;j++)
            if(g[i][j] == 'K')
                sx = i,sy = j;
                
    int hh = 0,tt = 0;
    q[0] = {sx,sy};
    
    memset(dist,-1,sizeof dist);
    dist[sx][sy] = 0;
    
    while(hh <= tt)
    {
        auto t = q[hh ++];
        
        for(int i = 0;i < 8;i++)
        {
            int a = t.x + dx[i], b = t.y + dy[i];
            if(a < 0 || a >= n || b < 0 || b >= m) continue;//不在范围内
            if(g[a][b] == '*')  continue;//是障碍物
            if(dist[a][b] != -1)    continue;//不是第一次被访问
            if(g[a][b] == 'H')  return dist[t.x][t.y] + 1;
            
            dist[a][b] = dist[t.x][t.y] + 1;
            q[++ tt] = {a,b};
        }
    }
    
    return -1;
}
int main()
{
    cin >> m >> n;
    
    for(int i = 0;i < n;i++)    cin >> g [i];
    
    cout << bfs() <<endl;
    
    return 0;
    
}

6.抓住那头牛

农夫知道一头牛的位置,想要抓住它。

农夫和牛都位于数轴上,农夫起始位于点 N N N,牛位于点 K K K

农夫有两种移动方式:

  1. X X X移动到 X − 1 X−1 X1 X + 1 X+1 X+1,每次移动花费一分钟
  2. X X X 移动到 2 ∗ X 2∗X 2X,每次移动花费一分钟

假设牛没有意识到农夫的行动,站在原地不动。

农夫最少要花多少时间才能抓住牛?

输入格式
共一行,包含两个整数 N N N K K K

输出格式
输出一个整数,表示抓到牛所花费的最少时间。

数据范围
0 ≤ N , K ≤ 1 0 5 0≤N,K≤10^{5} 0N,K105
输入样例:

5 17

输出样例:

4
5.1题解

看完题目以后,农夫不就是向右移动{-1,1,当前位置}这三种情况吗,
于是就普通至极,至于范围的话,
如果 k = = 1 e 5 , n > 50000 k==1e^{5},n>50000 k==1e5,n>50000时,实际上最短步数一定只有两种情况:

  1. 如果 n − 50000 < k − n n-50000<k-n n50000<kn时,就会后退到 50000 50000 50000 ∗ 2 *2 2
  2. 否则就一直 + 1 +1 +1 k k k

范围就是 0 < = n < = 1 e 5 0<=n<=1e^{5} 0<=n<=1e5

5.2代码
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;

int n, k;
int q[N];
int dist[N];

int bfs()
{
    memset(dist, -1, sizeof dist);
    dist[n] = 0;
    q[0] = n;

    int hh = 0, tt = 0;

    while (hh <= tt)
    {
        int t = q[hh ++ ];

        if (t == k) return dist[k];

        if (t + 1 < N && dist[t + 1] == -1)
        {
            dist[t + 1] = dist[t] + 1;
            q[ ++ tt] = t + 1;
        }
        if (t - 1 >= 0 && dist[t - 1] == -1)
        {
            dist[t - 1] = dist[t] + 1;
            q[ ++ tt] = t - 1;
        }
        if (t * 2 < N && dist[t * 2] == -1)
        {
            dist[t * 2] = dist[t] + 1;
            q[ ++ tt] = t * 2;
        }
    }

    return -1;
}

int main()
{
    cin >> n >> k;

    cout << bfs() << endl;

    return 0;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1118282.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 文字显示动画(2)

针对第一版的优化&#xff0c;自动适配文字大小&#xff0c;TextMeshPro可以拓展各种语言。第一版字母类语言效果更好。 using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI;public partial class TextBeat…

CSS 三栏布局

左右两列定宽&#xff0c;中间自适应 浮动margin <style>.container {width: 500px;height: 200px;line-height: 200px;}.left {width: 100px;height: 100%;float: left;background: orange;text-align: center;}.right {width: 100px;height: 100%;float: right;back…

大模型必备算力:CPUGPU天梯图(2023年最新版)

在当今计算机世界&#xff0c;CPU、GPU和显卡的性能成为了衡量计算机性能的重要指标。今天深入了解CPU、GPU和显卡天梯图。 首先&#xff0c;CPU作为计算机的大脑&#xff0c;负责处理各种任务。它的性能主要由核心数、主频和缓存大小决定。其中&#xff0c;核心数和主频决定了…

学会使用Pandas进行数据清洗

大家好&#xff0c;如果你对数据科学感兴趣&#xff0c;那么数据清洗可能对你来说是一个熟悉的术语&#xff0c;本文将向你介绍使用Pandas进行数据清洗的过程。我们的数据通常来自多个资源&#xff0c;而且并不干净&#xff0c;它可能包含缺失值、重复值、错误或不需要的格式等…

二分查找,求方程多解

1.暴力遍历&#xff1a; 解为两位小数&#xff0c;故0.001的范围肯定可以包含&#xff08;零点存在&#xff09; 2.均分为区间长度为1的小区间&#xff08;由于两解&#xff0c;距离不小于1&#xff09;&#xff0c;一个区间最多一个解 1.防止两边端点都为解 2&…

JOSEF约瑟 JY82-III JY82-1P JY82J电压等级380V 检漏继电器 面板安装

系列型号&#xff1a; JY82A检漏继电器 JY82B检漏继电器 JY82-380/660检漏继电器 JY82-IV检漏继电器 JY82-2P检漏继电器 JY82-2/3检漏继电器 JJKY检漏继电器 JD型检漏继电器 JY82-IV;JY82J JY82-II;JY82-III JY82-1P;JY82-2PA;JY82-2PB 一、产品概述 检漏继电器 J…

GitHub和Gitee的区别以及具体使用

文章目录 GitHub和GiteeGitHub和Gitee区别GitHub的使用Gitee的使用 GitHub和Gitee GitHub和Gitee区别 速度不同&#xff1a;GitHub位于美国&#xff0c;而Gitee位于中国。这意味着在中国使用Gitee可能会有更快的访问速度和更好的稳定性。如果我们希望体验Git飞一般的速度&…

基本指令(1):操作系统/Xshell,文件,路径

一、操作系统 操作系统是一款进行软硬件资源管理的工具&#xff0c;对上提供良好、稳定的运行服务。 二、文件 1. 文件 文件内容 文件属性 2. 所有的文件操作&#xff1a; 对文件的内容进行操作 对文件的属性进行操作 三、路径 3.1 路径的概念 路径的本质是&#xff…

Transformers基本组件(一)快速入门Pipeline、Tokenizer、Model

Transformers基本组件&#xff08;一&#xff09;快速入门Pipeline、Tokenizer、Model Hugging Face出品的Transformers工具包可以说是自然语言处理领域中当下最常用的包之一&#xff0c;实现了大量的主流预训练模型架构&#xff0c;并提供了对应的与训练好的模型文件。 借助…

遗传算法求解旅行商问题(含python源代码)

目录 前言 编码初始化种群 计算适应度 选择 交叉 变异 完整代码 总结 前言 这次的算法有一点不能确定是否正确&#xff0c;希望有大佬能够批评指正。 遗传算法的一般步骤 编码初始化种群 种群&#xff08;population&#xff09;指同一时间生活在一定自然区域内&…

推荐3个好评如潮的多人协作软件!

​在当今高度互联的社会中&#xff0c;多人协作已成为团队高效工作的关键。为了更好地满足团队合作的需求&#xff0c;许多优秀的多人协作软件应运而生。 在本文中&#xff0c;我们将向大家推荐3款拥有良好口碑的多人协作软件&#xff1a;boardmix博思白板、Notion和Trello。这…

Linux_API_系列-整体概览

总论 Linux下API编程不像Windows一样&#xff0c;对每种设备和不同功能都有统一的API&#xff0c;所以有了《Windows核心编程》这种导论一类的大而全的书籍&#xff0c;整本书厚的像一块砖头。 Linux下贯彻了一贯的“一切皆文件”的宗旨&#xff0c;所以对于系统编程而言&…

Linux进程概念(下)

僵尸进程 进程内核数据结构PCB进程的代码和数据&#xff0c;都要占据内存空间&#xff0c;那么进程退出的核心工作之一&#xff1a;即将PCB和自己的代码和数据释放掉 我们创建进程的目标一定是为了完成某种任务&#xff0c;父进程/OS要知道该进程把任务完成的怎么样&#xff…

轻松实现批量转换,将JPG图片一键转换为PNG格式!

在处理大量图片时&#xff0c;将JPG格式图片转换为PNG格式可能会耗费您大量的时间和精力。为了让您的工作更加轻松&#xff0c;我们为您推出了一款高效的批量图片处理工具&#xff0c;让您能够轻松将JPG图片一键转换为PNG格式&#xff0c;提高处理效率&#xff01; 首先&#…

使用命令行cli脚手架创建uniapp项目(微信小程序、H5、APP)

除了使用HBuilderX工具可视化搭建项目外&#xff0c;DCloud官方还提供了一个脚手架用于命令行搭建项目。 uni-app项目支持 uni cli和 HBuilderX cli两种脚手架工具&#xff1a; uni cli&#xff1a;面向非HBuilderX的用户&#xff08;如习惯使用vscode/webstorm的开发者&#…

【数据结构】八大排序

目录 1. 排序的概念及其作用 1.1 排序的概念 1.2 排序运用 1.3 常见的排序算法 2. 常见排序算法的实现 2.1 插入排序 2.1.1 基本思想 2.1.2 直接插入排序 2.1.3 希尔排序&#xff08;缩小增量排序&#xff09; 2.2 选择排序 2.2.1 基本思想 2.2.2 直接选择排序 2.2…

掌握Java中的volatile关键字

高速缓存 什么是高速缓存 高速缓存&#xff08;Cache&#xff09;是一种用于存储计算机数据的临时存储设备&#xff0c;用于加速数据访问速度&#xff0c;减少对主存储器&#xff08;RAM&#xff09;或磁盘的频繁访问。高速缓存通过将最常用的数据存储在更接近CPU的位置&…

使用Perl和WWW::Mechanize库编写

以下是一个使用Perl和WWW::Mechanize库编写的网络爬虫程序的内容。代码必须使用以下代码&#xff1a;jshk.com.cn/get_proxy 首先&#xff0c;确保已经安装了Perl和WWW::Mechanize库。如果没有&#xff0c;请使用以下命令安装&#xff1a; cpan WWW::Mechanize创建一个新的Pe…

【MATLAB源码-第52期】基于matlab的4用户DS-CDMA误码率仿真,对比不同信道以及不同扩频码。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. DS-CDMA系统 DS-CDMA (Direct Sequence Code Division Multiple Access) 是一种多址接入技术&#xff0c;其基本思想是使用伪随机码序列来调制发送信号。DS-CDMA的特点是所有用户在同一频率上同时发送和接收信息&#xf…