【算法】蓝桥杯dfs深度优先搜索之凑算式总结

2023-11-08

本文               → 《【算法】蓝桥杯dfs深度优先搜索之凑算式总结》

相关文章        →《【算法】蓝桥杯dfs深度优先搜索之排列组合总结》

                      →《【算法】蓝桥杯dfs深度优先搜索之图连通总结》

 

前言

曾几何时这个词现在用正适合不过了。

曾几何时我还是对dfs算法一脸懵x的状态,虽说大二的时候学过数据结构,但是那一学期被我荒废了......详情等我毕业了再说吧。

还有四天就要考蓝桥杯了,我分析了近四年的蓝桥杯(B组)题型,分类纯属个人理解,并非官方宣布,如下表:

注:

以下DFS代表Depth First Search首字母缩写,即深度优先搜索,简称深搜

以下DP代表Dynamic Programming首字母缩写,即动态规划,没有简称 : )

 

2015年(第六届)蓝桥杯B组省赛
分类 题号 总分
水题 1(3分)、2(5分)、4(11分) 19分
DFS/爆破 3(9分)、5(15分)、7(21分) 45分

冒泡

(加法乘法)

6(17分) 17分

取余

(饮料换购)

8(13分) 13分
矩阵 9(25分) 25分
DP 10(31分) 31分
2016年(第七届)蓝桥杯B组省赛
分类 题号 总分
递推 1(3分)、2(5分) 8分
函数调用 4(11分) 11分
DFS/爆破

3(9分)、5(13分)、

6(15分)、7(19分)、

8(21分)

77分
DP 9(23分) 23分
数据结构 10(31分) 31分
2017年(第八届)蓝桥杯B组省赛
分类 题号 总分
文件处理 1(5分)、3(13分) 18分
DFS/爆破 2(11分)、4(17分) 28分
水题 5(7分) 7分
DP 6(9分)、8(21分) 30分
日期问题 7(19分) 19分
二分问题 9(23分) 23分
前缀和 10(25分) 25分
2018年(第九届)蓝桥杯B组省赛
分类 题号 总分
水题 1(5分)、2(7分) 12分
复数 3(13分) 13分
排序 5(9分)、6(11分) 20分
找规律 7(19分) 19分
尺取法 8(21分) 21分
DFS/爆破 9(23分) 23分
DP 4(17分)、10(25分) 42分

可以看到每年蓝桥杯都会考察dfs类型的题,而且分值在23-77分之间不等,虽说分值成逐年下降的趋势,但怎么说也有20+分,蓝桥杯满分150分,普通人(我就是普通人中之一)总共能拿到的分数大概在80分左右,而DFS就包括在这80分之内,所以一定要掌握好。

以上是对题型及分值的分析,接下来分析一下为何蓝桥杯总要考dfs算法?首先看一则人物百科:

再来看一下“深度优先搜索”的百度词条:

还有一点值得提出,这位大神目前好像在中国清北或港大其中一个学校任教。

蓝桥杯作为一个算法类竞赛,再退一步讲,怎么说也得给老前辈一个面子吧。

综上所述,蓝桥杯考dfs算法的概率胜过千足金含金量的比率!


正文

下文的大部分灵感均来自于【CSDN】梅森上校《JAVA版本:DFS算法题解两个例子(走迷宫和求排列组合数)》

下面会贴出蓝桥杯第六届B组省赛第3题,第5题;第七届B组省赛第3题,第8题;第八届B组省赛第2题,共5道题。

因为它们都是:凑算式

【第一道题】

【分析】

总共有8个不同的字,每个字都代表不同的数,申请一个一维数组a[8]存储这8个不同的数。

a[8]对应有下标index:0至7

所以dfs方法定义为

public static void dfs(int index)

然后设计结束条件,就是index等于8,越界了,代表找够了8个数,尝试进行判断是否构成等式。

if(index == 8) { 
    int sum = (a[0]*1000+a[1]*100+a[2]*10+a[3]) + (a[4]*1000+a[5]*100+a[6]*10+a[1]);
    if(sum == a[4]*10000+a[5]*1000+a[2]*100+a[1]*10+a[7]) 
        System.out.println(a[4]+""+a[5]+""+a[6]+""+a[1]);
    return;
}

如果index没有越界,a[]数组没存够8个数,就进行搜索。

因为从0至9搜索,且每个数不能重复,所以每访问一个都需要标记一下,visited[i] 为 0 代表未访问,为 1 代表已访问。

for(int i=0; i<=9; i++) {
    if(visited[i] == 0) {// 代表没被访问过,可以访问
        visited[i] = 1; // 访问 i, 做标记
        a[index] = i; // 往数组里放数
        dfs(index+1); // 枚举下一种情况
        visited[i] = 0; // 回溯, 清除标记
    }
}

通过数学分析,祥字不可能为0,否则无法进位,三字必为1,因为十进制进位只能进1,所以最终搜索代码如下:

for(int i=0; i<=9; i++) {
    if(index == 0 && i == 0) {// 祥字不可能为0,否则就无法进位了
        continue; 
    }
    if(index == 4 && i != 1) {// 三字必为1,因为十进制进位只能进1
        continue; 
    }
    if(visited[i] == 0) {// 代表没被访问过,可以访问
        visited[i] = 1; // 访问 i, 做标记
        a[index] = i;
        dfs(index+1);
        visited[i] = 0; // 回溯, 清除标记
    }
}

【完整代码】

/**
 * 
 *   祥瑞生辉
 * + 三羊献瑞
 * ----------
 * 三羊生瑞气 
 *   
 *  抽象为如下:
 *
 *     a[0]a[1]a[2]a[3]
 *  +  a[4]a[5]a[6]a[1]        
 *-------------------          
 * a[4]a[5]a[2]a[1]a[7]  
 * 
 */
public class Main {
	static int[] a = new int[8]; // 总共有8个不同的字,代表8个不同的数
	static int[] visited = new int[] {0,0,0,0,0,0,0,0,0,0}; // 10个0, 标记0-9十个数是否被访问过
	public static void dfs(int index) {
		// index为8,越界,代表8个数找够了,同时也是递归结束条件
		if(index == 8) { 
			int sum = (a[0]*1000+a[1]*100+a[2]*10+a[3]) + (a[4]*1000+a[5]*100+a[6]*10+a[1]);
			if(sum == a[4]*10000+a[5]*1000+a[2]*100+a[1]*10+a[7]) 
				System.out.println(a[4]+""+a[5]+""+a[6]+""+a[1]);
			return;
		} else {// 不够8个数,0-9十个数,深搜
			for(int i=0; i<=9; i++) {
				if(index == 0 && i == 0) {// 祥字不可能为0,否则就无法进位了
					continue; 
				}
				if(index == 4 && i != 1) {// 三字必为1,因为十进制进位只能进1
					continue; 
				}
				if(visited[i] == 0) {// 代表没被访问过,可以访问
					visited[i] = 1; // 访问 i, 做标记
					a[index] = i;
					dfs(index+1);
					visited[i] = 0; // 回溯, 清除标记
				}
			}
		}
		
	}

	public static void main(String[] args) {
		dfs(0);
	}

}

没看懂这道题?没关系。继续往下看。

【第二道题】

【分析】

这是一道填空题,基本代码已经给出来了,我只是借题发挥,讲解一下dfs算法。

上一题是8个数,我们设置了一个a[8],这道题是9个数,所以设置一个a[9]

同样需要一个index:0至8

这道题和上一道题的区别在于题目用了dfs()方法多了一个数组参数,如下

public static void dfs(int[] a, int index) 

结束条件和上一题类似,当index为9时,越界。

if(index == 9) { 
    int m = a[0]*1000+a[1]*100+a[2]*10+a[3];
    int n = a[4]*10000+a[5]*1000+a[6]*100+a[7]*10+a[8];
    if(m*3 == n) 
        System.out.println(m+" "+n);
    return;
}

如果index不为9,代表还没凑够9个数,深搜。上一题深搜之前是做标记,深搜之后重置标记,这一题类似,深搜之前交换,深搜之后重置交换,代码如下:

for(int i=index; i<a.length; i++){
    int t=a[index]; a[index]=a[i]; a[i]=t; // 交换a[index]和a[i]
    dfs(a,index+1);
    t=a[index]; a[index]=a[i]; a[i]=t; // 再次交换a[index]和a[i]
}

这道填空题需要注意的是,不要完全照抄以致于连 int 都抄上了,导致 t 被声明两次,报错。

【完整代码】

public class Main {

	public static void dfs(int[] a, int index) {
                // 结束条件
		if(index == 9) { 
		    int m = a[0]*1000+a[1]*100+a[2]*10+a[3];
		    int n = a[4]*10000+a[5]*1000+a[6]*100+a[7]*10+a[8];
		    if(m*3 == n) 
		        System.out.println(m+" "+n);
		    return;
		}
		
		for(int i=index; i<a.length; i++){
		    int t=a[index]; a[index]=a[i]; a[i]=t; // 交换a[index]和a[i]
		    dfs(a,index+1);
		    t=a[index]; a[index]=a[i]; a[i]=t; // 再次交换a[index]和a[i]
		}
	}
	public static void main(String[] args) {
            int[] a = new int[]{1,2,3,4,5,6,7,8,9};
	    dfs(a,0);
	}

}

又没看懂?没关系。继续往下看。

【第三道题】

此题和第二道题类似,都是1-9九个数字,不过这里要注意的是,第二题用乘法代替了除法,这道题虽然说也可以改成乘法,但是会相对麻烦一点,干脆就直接用除法,一旦涉及到除法,就有可能产生浮点数,所以我们在声明数组的时候不能再声明为int了,必须声明为double。

index还是int的,取值范围为0至8

dfs方法定义如下:

public static void dfs(double[] a,int index)

结束条件就是index==9,越界

if(index == 9) {
    if(a[0]+a[1]/a[2]+(a[3]*100+a[4]*10+a[5])/(a[6]*100+a[7]*10+a[8]) == 10)
        count++;
    return;
}

当index不够9的时候,进行深搜

for(int i=index; i<a.length; i++) {
    double t = a[index]; a[index]=a[i]; a[i] = t;
    dfs(a,index+1);
    t = a[index]; a[index]=a[i]; a[i] = t;				
}

【完整代码】

public class 凑算式交换法dfs {
	
	public static int count = 0;
	public static void dfs(double[] a,int index) {
		// 结束条件
		if(index == 9) {
			if(a[0]+a[1]/a[2]+(a[3]*100+a[4]*10+a[5])/(a[6]*100+a[7]*10+a[8]) == 10)
				count++;
			return;
		} else {
			for(int i=index; i<a.length; i++) {
				double t = a[index]; a[index]=a[i]; a[i] = t;
				dfs(a,index+1);
				t = a[index]; a[index]=a[i]; a[i] = t;				
			}
		}
	}
	
	public static void main(String[] args) {
		double[] a = new double[] {1.00,2.00,3.00,4.00,5.00,6.00,7.00,8.00,9.00};
		dfs(a,0);
		System.out.println(count);
	}

}

当然,这道题也可以像第一题“三羊献瑞”那样,使用递归之前标记法

【标记法完整代码】

public class 凑算式标记dfs {
	public static double[] a = new double[9];
	public static int[] visited = new int[] {0,0,0,0,0,0,0,0,0}; // 9个0
	public static int count = 0;
	public static void dfs(int index) {
		// 结束条件
		if(index == 9) {
			if(a[0]+a[1]/a[2]+(a[3]*100+a[4]*10+a[5])/(a[6]*100+a[7]*10+a[8]) == 10)
				count++;
			return;
		} else {
			for(int i=1; i<=9; i++) {
				if(visited[i-1] == 0) { // 因为i从1开始,所以需要 -1
					visited[i-1] = 1; // 标记
					a[index] = (double)i;
					dfs(index+1);
					visited[i-1] = 0; // 清除标记
				}
			}
		}
	}
	
	public static void main(String[] args) {
		dfs(0);
		System.out.println(count);
	}

}

对visited初始化的说明:

Java语言int型数组初始化时会自动赋值为0,但是我为了直观表达,所以选择了显式初始化。

今天已经深夜1:22,还有一个四平方和没有写,明天再写

我一定会回来的......


我又回来了,继续看题。

【第四道题】

通过上面的三道题,我想现在的dfs的套路应该已经有一些印象了吧。

因为是四平方,要存四个数,所以我们思考都不用思考,先整个a[4]

同理,需要一个index,0至3

因为前几道题的程序都不需要我们进行输入,这道题需要输入一个num,而且还需要进行等式判断,所以需要作为dfs()方法的一个参数,这样dfs()方法定义如下:

public static void dfs(int index, int num)

递归结束条件为index==4,越界,代表a[]数组存够4个数了,可以进行等式判断了,代码如下:

if(index == 4) {
    if(num == (int)(Math.pow(a[0], 2)+Math.pow(a[1], 2)
                              +Math.pow(a[2], 2)+Math.pow(a[3], 2))) {
        System.out.println(a[0]+" "+a[1]+" "+a[2]+" "+a[3]);
    }
    return;
}

如果index不等于4,代表4个数还没找够,深搜。这里要注意3件事:

一是深搜的范围,最大范围是三个0和输入数字的开根号。

二是Java中Math.sqrt()方法返回值是double,最好转为int,让两个int进行比较。

三是递归之前要不要留下已访问的标记,或者交换?从给出的输入样例可以看出来,有0 0 1 2 、 0 2 2 2 这样的输出,所以说数字是可以重复使用的,那么就没必要进行标记或者交换了。这也是这道题和前三道题区别之一。

综上,搜索代码如下

for(int i=0; i<=(int)Math.sqrt(num); i++) {
    a[index] = i;
    dfs(index+1,num);
}

【完整代码】

import java.util.Scanner;

public class 四平方和dfs {
	
    public static int[] a = new int[4];

    public static void dfs(int index, int num) {
	// 结束条件
        if(index == 4) {
            if(num == (int)(Math.pow(a[0], 2)+Math.pow(a[1], 2)
                                +Math.pow(a[2], 2)+Math.pow(a[3], 2))) {
                System.out.println(a[0]+" "+a[1]+" "+a[2]+" "+a[3]);
            }
            return;
        }
        // 搜索
        for(int i=0; i<=(int)Math.sqrt(num); i++) {
            a[index] = i;
            dfs(index+1,num);
        }
    }
	
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        dfs(0,num);
}

【等等,这道题还没完】

毕竟是一道23分的大题,尊重一下出题人嘛,怎么会让你这么轻松的拿分呢?

如果按照上面的代码,输入5,会输出下面的结果

5
0 0 1 2
0 0 2 1
0 1 0 2
0 1 2 0
0 2 0 1
0 2 1 0
1 0 0 2
1 0 2 0
1 2 0 0
2 0 0 1
2 0 1 0

显然,人家只要第一行。在赵壮同学的指点下,直接在输出下面加一句System.exit(0);就可以了。

System.out.println(a[0]+" "+a[1]+" "+a[2]+" "+a[3]);
System.exit(0); // 加上这句,打印完直接结束程序

【再等最后一下,真的】

虽然说上面的代码能够实现输出第一行,但是深搜毕竟是一种盲目的递归,进行大量无用的尝试,最终导致超时。我仅仅是拿这道题让大家更深入了的理解一下dfs这个算法。就上面的代码,我测试了一下 773535 这个输入,Eason的《好久不见》循环播放三遍了都还没跑出来,这要是提交了蓝桥比赛,那就GG了......

其实深搜大部分都可以用for循环暴力破解代替,这样可以减少一下盲目性,比如这道题的解法可以参考下面这篇文章:

【CSDN】有梦就不怕痛《蓝桥杯 四平方和》

Java版代码如下(运行飞一般的流畅):

import java.util.Scanner;

public class 四平方和爆破 {

    public static void main(String[] args) {
        int n, a, b, c, d;
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        for (a = 0; a < 3000; ++a) {// 3000² = 900万 > 500万
            for (b = a; b < 3000; ++b) {
                for (c = b; c < 3000; ++c) {
                    d = (int)Math.sqrt(n - a * a - b * b - c * c);
                    if (n == a * a + b * b + c * c + d * d) {
                        if (c > d) {
                            int temp = d;
                            d = c;
                            c = temp;
                        }
                        System.out.println(a+" "+b+" "+c+" "+d);
                        return; // 找到之后就return,让所有循环结束
                    }
                }
            }
        }
    }
}

好了,我已经逐个分析了四道题了,本来已经快要分析吐了,不想再分析了。但是后来想了想小王子里面那句话:“每个大人都曾经是个孩子,可又有几个人记得呢?”还有我国晋惠帝说的一句千古名言:“何不食肉糜?”

下面这道题就算是对“凑算式”这类题型的一个总结吧。

【第五道题】

有了上面四道题的经验,看到这种凑算式的题,上来想都不用想:

第一件事,就是设数组

第二件事,数字能否重复使用?能,略过这条;不能,设标记数组,或者交换(我个人偏向设标记数组)

第三件事,定义dfs()方法

第四件事,判断递归结束条件,通常是index越界,并进行等式判断

第五件事,还未凑齐数,深度优先搜索

第六件事,写main()方法

完事

【完整代码】

public class 纸牌三角形dfs {

    public static int[] a = new int[9];
    public static int[] visited = new int[] {0,0,0,0,0,0,0,0,0};
    public static int count = 0;
    public static void dfs(int index) {
        // 结束条件
        if(index == 9) {
            if(a[0]+a[1]+a[3]+a[5] == a[0]+a[2]+a[4]+a[8] &&
                a[0]+a[1]+a[3]+a[5] == a[5]+a[6]+a[7]+a[8]) {
                count++;
            }
            return;
        }
        // 搜索
        for(int i=1; i<=9; i++) {
            if(visited[i-1] == 0) { // i从1开始,所以要i-1
                visited[i-1] = 1;
                a[index] = i;
                dfs(index+1);
                visited[i-1] = 0;
            }
        }
    }
	
    public static void main(String[] args) {
        dfs(0);
        System.out.println(count/6);
    }

}

这道题有个坑就是要去重,因为题中说明“旋转,镜像后相同的算一种”,所以最后要count/6.这个纯靠经验了,有过旋转经验的就知道,每个数都有机会占在顶点上,所有数固定后,转动的话,等于每个数计算了3次,所以要除以3;对于镜像,同样是靠经验,如果你知道从镜子里看左右会对换的话,就会知道要除以2,总共除以6.

在没做这道题之前,我是不知道镜像是什么样的,因此我还特意拿个镜子照了照。

 

 

 

这篇文章就到此结束吧,我要开一个新坑了,明天应该能发布新文章:

《【算法】蓝桥杯dfs深度优先搜索之排列组合总结》

 

如果看完这5道题还不会这种“凑算式”的题,请发QQ邮箱:424171723@qq.com 或 直接加我QQ,进行手把手教学。

 


【参考文章】

  1. 【CSDN】梅森上校《JAVA版本:DFS算法题解两个例子(走迷宫和求排列组合数)》
  2. 【CSDN】winycg《2015蓝桥杯 三羊献瑞(回溯法dfs)》
  3. 【CSDN】有梦就不怕痛《蓝桥杯 四平方和》
  4. 还有一些CSDN、博客园、简书.......由于浏览篇幅太多,所以一些未列在其中,表示抱歉

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【算法】蓝桥杯dfs深度优先搜索之凑算式总结 的相关文章

  • Python中的MetaPathFinder

    MetaPathFinder 是 Python 导入系统中的一个关键组件 它与 sys meta path 列表紧密相关 sys meta path 是一个包含 MetaPathFinder 实例的列表 这些实例用于自定义模块的查找和加载逻
  • 外汇市场与交易系统读书笔记(1)

    本文为 外汇市场与交易系统 这本书的读书笔记 1 a 汇率报价一般有五个数字 包括小输掉 其中 精度最高到小数点后四位 一般而言 我们以五个数字中的最低位作为基本点 b 外汇即期汇率报价一般包含买入汇率和卖出汇率 例如usd jpy的汇率可
  • 【知识积累】分析并实现O(N^2)的算法(对数器验证)

    1 选择排序 package com example demo algorithm import java util Arrays Description 选择排序 数据规模 N 0 N 1 看 比 交换 1 N 1 看 比 交换 2 N
  • SoC的开发

    怎么做SoC SoC是干啥的 SoC就是将CPU GPU Uart I2C WiFi Etherne等硬件IP连起来 做到一个芯片上 主要工作有 1 用verilog将这些IP core连起来 在verilog仿真器上进行验证 也要写一些C
  • Axure Repeater系列---排序

    最新学习整理Repeater 网上也能找到一些实现排序的帖子 但是对于不熟悉中继器的同学来说 直接上手还是有点难度的 我也遇到一些坑 特整理记录下来 共同学习 学习之前最好了解下中继器的各个属性以及函数的含义 工具 Axure8 0 学习目

随机推荐

  • 使用人声分离在线网站获得音乐

    有时候碰到一个广告中的音乐 觉得非常悦耳 想将它占为己有 使用到自己的片子中 但奈何其中有广告人声 想获得纯的音乐 如何做到呢 本文给出了方法 希望对你有用 注 本教程使用到了几个工具 1 fdm 下载片源 2 视频编辑大师 分离视频中的音
  • MySQL必知必会——第二十章更新和删除数据

    更新和删除数据 本章介绍如何利用UPDATE和DELETE语句进一步操纵表数据 更新数据 为了更新 修改 表中的数据 可以使用UPDATE语句 UPDATE的两种用法 更新表中特定行 更新表中所有行 不要省略WHERE子句 缺少WHERE子
  • 树莓派教程 - 2.1 树莓派USB摄像头 树莓派罗技免驱摄像头 fswebcam常用参数

    树莓派外接摄像头 最常用的有两种 CSI摄像头 USB摄像头 当然网络摄像头也是可以的 一般的USB摄像头都是UVC免驱的 而且可以方便的插拔和安装 平时最为常用 一 硬件设备 usb摄像头使用的 罗技c310 只要是UVC免驱就可以 二
  • QT实现聊天室

    qt实现聊天室 项目功能简介 1 连接 客户端 需要先连接服务器 就是输入服务器端的IP和端口连接服务器 如果连接成功 连接按钮显示文字会显示已连接 颜色变浅 2 注册 接下来是注册 如果申请的用户名还有人用户注册 则可以注册成功 如果之前
  • JS之instanceof详解

    instanceof 用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上 语法 object instanceof constructor object 某个实例对象 constructor 某个构造函数 用来检测
  • Github使用学习笔记(四)

    第四节任务 Github中奇怪的后缀文件都是什么 一 README md 1 README md的作用 在构建完整项目结构的根目录下应该有一个名为ReadMe的文件来说明当前版本源码结构或版本信息 如果你常看开源项目也会发现一个规律 在你拿
  • QuestMobile 2017年中国移动互联网年度报告

    来源 QuestMobile 2017年 科技的风口兜兜转转 从直播 VR到AI再到区块链 短视频泛娱乐IP 最终在2017年底定格在了知识付费上 然而这并没有结束 紧随知识付费而来的就是撒币 大撒币 这就是中国移动互联网的奇妙之处 再严肃
  • 2021-07-19王汕7.19国际黄金今日行情趋势分析,期货原油白银最新操作建议

    黄金行情走势分析 刚刚过去的一周 现货黄金冲高回落 美联储主席多次发表鸽派言论 多个国家新冠疫情回升 一度帮助金价创一个月新高至1834 12美元 盎司 散户和机构也看涨后市 但美国零售销售等数据表现靓丽 仍使投资者坚定美联储未来逐步收紧货
  • vue后端传值1和0怎么绑上对应得值?

    目录 前言 解决 前言 在做表格绑定后端返回得数据后 发现后端返回得有些字段值是0或者1等数字 但是我们在表格中需要展示得却是相对应得男 女 是 否等等 下面是我得解决办法 解决 我使用得是element ui库 后端返回得参数中是否签到字
  • 洛谷 P5715 三个数按照从小到大排序

    这是一个经典的例题 与比较两个数的大小的方式相同 建立一个中间变量 对数的大小进行排序 但不同的是 这个题在思路上较为复杂一点 思路 我们规定好输出的顺序从小到大依次是a b c 建立一个中间变量t 像比较两个数的大小的方法那样 对大小顺序
  • CAS,AQS,volatile,native,synchronized,lock关键字解读以及它们之间的联系(高频面试)

    1 CAS CAS比较并交换 没啥好说的 下面来说一下具体实现底层 CAS底层是由native修饰的 native是调用的本地C 代码Safe app类中的 lock IF MP方法 什么意思呢 就是说如果 IF 计算机是多核状态下 MP
  • ERROR: No matching distribution found for XXXXX 国内的镜像源来加速网络

    用国内的镜像源来加速网络 pip install 包名 i http pypi douban com simple trusted host pypi douban com 其中 trusted host pypi douban com 是
  • DLL地狱及其解决方案

    原作者 Ivan S Zapreev 概要 本文将要介绍DLL的向后兼容性问题 也就是著名的 DLL Hell 问题 首先我会列出自己的研究结果 其中包括其它一些研究者的成果 在本文的最后 我还将给出 DLL Hell 问题的一个解决方案
  • MySQL修改字段允许为空

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 环境 MySQL 5 1 命令行工具 问题 MySQL修改字段允许为空 解决 alter table topic modify state int 4 null 语法总结
  • org.apache.poi.poifs.filesystem.NotOLE2FileException: Invalid header signature;

    今天学习poi导入导出excel 然后报错valid header signature 经过排查是因为没有关闭流 workbook close 关闭之后就可以了
  • kafka常用命令汇总(亲测自用)

    文章目录 一 启动kafka 二 查看命令 三 创建topic 四 生产者 五 消费者 六 修改topic 七 删除topic 一 启动kafka kafka 2 13 3 3 1 zookeeper 3 4 14 2 13 3 3 1 前
  • 基础篇——Pycharm的安装与使用windows+ubuntu 初学者此篇够用

    简介 Pycharm是python编程过程中最为推荐的编辑调试软件之一 其使用简单 界面友好 也成了学习Python路上必须学会的软件之一 本篇教程简单介绍一下windows用户从安装到日常使用的基本功能 其他系统也可简单参考 软件安装 P
  • 嵌入式Linux学习笔记 1-14 异常与中断

    1 异常与中断的概念引入与处理流程 上图解释了何为中断何为异常 其中中断也是属于一种异常 引申拓展为ARM对异常 中断 的处理过程 1 初始化 1 设置中断源 让他可以产生中断 如某个按键可以产生中断的话 我们可以设置他的gpio引脚为中断
  • LeetCode刷题笔记--015. 三数之和

    题目描述 给定一个包含 n 个整数的数组 nums 判断 nums 中是否存在三个元素 a b c 使得 a b c 0 找出所有满足条件且不重复的三元组 注意 答案中不可以包含重复的三元组 例如 给定数组 nums 1 0 1 2 1 4
  • 【算法】蓝桥杯dfs深度优先搜索之凑算式总结

    本文 算法 蓝桥杯dfs深度优先搜索之凑算式总结 相关文章 算法 蓝桥杯dfs深度优先搜索之排列组合总结 算法 蓝桥杯dfs深度优先搜索之图连通总结 前言 曾几何时这个词现在用正适合不过了 曾几何时我还是对dfs算法一脸懵x的状态 虽说大二