1.VsCode配置方法

先用的这个:

https://www.cnblogs.com/Neal-lee/p/13512084.html

(可能不需要上面的)

之后是拿这个成功的:

https://blog.csdn.net/davidhopper/article/details/79397487

下面是一些我的电脑的配置细节,你们按照上面走就可以,像安装过dev,就可以直接找到MinGw,不需要再下。

但是但是:

dev的那个用的c++太落后了

就vector和 迭代器以及vescode的bug就又得重搞mingw

之后我是跟着这个走的:https://blog.csdn.net/qq_33472553/article/details/96580127

要注意的是:要把环境变量的原来的dev那个给删掉 —–

搞这搞了两天搞死我了—-chao

system(“pause”);

可以让黑框框停留下来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{

"version": "0.2.0",

"configurations": [

{

"name": "(gdb) Launch", // 配置名称,将会在启动配置的下拉菜单中显示

"type": "cppdbg", // 配置类型,这里只能为cppdbg

"request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)

"program": "${workspaceRoot}/${fileBasenameNoExtension}.exe",// 将要进行调试的程序的路径

"args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可

"stopAtEntry": false, // 设为true时程序将暂停在程序入口处,一般设置为false

"cwd": "${workspaceRoot}",// 调试程序时的工作目录,一般为${workspaceRoot}即代码所在目录

"environment": [],

"externalConsole": true,// 调试时是否显示控制台窗口,一般设置为true显示控制台

"MIMode": "gdb",

"miDebuggerPath": "C:\\Program Files (x86)\\Dev-Cpp\\MinGW64\\bin\\gdb.exe",// miDebugger的路径,注意这里要与MinGw的路径对应

"preLaunchTask": "g++", // 调试会话开始前执行的任务,一般为编译程序,c++为g++, c为gcc

"setupCommands": [

{

"description": "Enable pretty-printing for gdb",

"text": "-enable-pretty-printing",

"ignoreFailures": true

}

]

}

]

}


1
tasks.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"version": "0.1.0",
"command": "g++",
"args": ["-g","${file}","-o","${fileBasenameNoExtension}.exe"], // 编译命令参数
"problemMatcher": {
"owner": "cpp",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": {
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
}
}

ctrl+F2选中所有一样的

设置里面可以改字号

shift+alt+F 自动缩进

以上就是当初配置vscode编写c++的配置过程,下面是当初刚开始接触算法题时候的算法笔记吧(算是

2.bfs经典例题

—躲障碍—

暑期集训的一天下了大雨,地面出现了许多泥坑,一踩一脚泥。小tao从坐标平面上的点(0,0)出发,准备去向文瀛餐厅(X , Y)(-500≤ X , Y≤ 500)。在路上有N(1≤ N≤ 10000)个泥坑,位于点(Ai,Bi)(-500≤ Ai , Bi≤500)。

小tao为了好好集训,买了一双新鞋子来鼓舞自己,他不想弄脏鞋子,但他也想尽快到达餐厅干饭。如果小tao只能平行于轴线移动,并在整数坐标点转向,请问他到达餐厅且保持鞋子干净要走的最小距离是多少?

保证总是有一条没有泥的路使得小tao可以走到餐厅。

输入: 第1行:三个空间分隔的整数:X、Y和N。 表示餐厅坐标以及泥坑的数量。

第2..N+1行:第i+1行包含两个空格分隔的整数:Ai和Bi。 表示每个泥坑的坐标。

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

输出:输出小tao在不踩泥的情况下到达文瀛餐厅所需的最小距离。

1
11

代码c++:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include<iostream>
#include<queue>
#define maxn 1005
using namespace std;
int n,m;
struct node{
int x,y,l;//这里的l表示到坐标为(x,y)的步数
};
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
bool vis[maxn][maxn];//判断是否跑过了
int map[maxn][maxn];//判断障碍
//判断是否越界,判断是否有障碍物;
bool check(int x,int y){
if(x>=0&&x<=1000&&y>=0&&y<=1000&&!vis[x][y]&&!map[x][y])return true;
return false;
}
int bfs(){
queue<node>q;//创建队列,<>这里面是类型,q是这个队列的总名
node s;s.x=500,s.y =500,s.l =0;
q.push(s);
vis[s.x ][s.y ]=1;
while(!q.empty() ){
//读取进去的,然后抛弃他
node u=q.front() ;q.pop() ;
if(u.x ==m&&u.y ==n){
//满足的时候返回路的数值
return u.l ;
}
for(int i=0;i<4;i++){
int tx=u.x +dx[i];
int ty=u.y +dy[i];
if(check(tx,ty)){
node temp;temp.x =tx;temp.y =ty;
temp.l =u.l+1;
//满足条件的话,可以往队例里边加入新的模块
q.push(temp);
vis[tx][ty]=1;
}
}
}
}
int main(){
int Y1,X1,NN;
//题目要求范围是500~-500,所以
cin>>m>>n>>NN;
m=m+500;n=n+500;
for(int i=0;i<NN;i++)
{
cin>>X1>>Y1;
map[X1+500][Y1+500]=1;
}

cout<<bfs()<<endl;
return 0;
}

代码java:

java队列函数和C++不一样:

.add()添加一组数据尾部

.firstNode()取第一组数据,不删

.poll() /.pop() 取第一组,删除

.size()有几组值

.removeFirst()删除第一组数据

.push()往最前面插入一组值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import java.util.LinkedList;
import java.util.Scanner;

public class Main{
//在java中,LinkedList实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。LinkedList是实现了List接口和Deque接口的双向链表
//所以本题用LinkedList代替Queue。
public static LinkedList<Q> que = new LinkedList<Main.Q>();//que为队列的名字
public static class Q{
int x;
int y;
int l;
}
public static int n,m,maxn=1005;
public static int dx[]={1,-1,0,0};
public static int dy[]={0,0,1,-1};
public static boolean vis[][]= new boolean [maxn][maxn];//判断是否跑过了
public static int map[][] = new int[maxn][maxn];//判断障碍
public static boolean check(int x,int y){
if(x>=0&&x<=1000&&y>=0&&y<=1000&&!vis[x][y]&&map[x][y]==0)return true;
return false;
}
public static int bfs(){
Q s=new Q();//这代表的是创建一个队列对象
s.x=500;s.y =500;s.l =0;
que.add(s);
vis[s.x ][s.y ]=true;
while(que.size()!=0 ){
Q u=que.poll();
if(u.x ==m&&u.y ==n){
return u.l ;
}
for(int i=0;i<4;i++){
int tx=u.x +dx[i];
int ty=u.y +dy[i];
if(check(tx,ty)){
Q temp=new Q();temp.x =tx;temp.y =ty;
temp.l =u.l+1;
que.add(temp);
vis[tx][ty]=true;
}
}
}
return -1;
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);

int Y1,X1,NN;
m = scanner.nextInt();
n = scanner.nextInt();
NN = scanner.nextInt();
m=m+500;n=n+500;
for(int i=0;i<NN;i++)
{
X1 = scanner.nextInt();
Y1 = scanner.nextInt();
map[X1+500][Y1+500]=1;
}

System.out.println(bfs());


}
}

3.dfs例题

———-八皇后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class Main {
public static boolean Isdanger(int row,int col,int[][]C2) {
for(int i=0;i<row;i++)
{
if(C2[i][col]==1)return false;

for(int j=0;j<n;j++)
{
if((((row+col)==(i+j))||((row-col)==(i-j)))&&C2[i][j]==1)
return false;
}
}
return true;
}
static int n=8,count;
public static void main(String[] args) {

int C1[][] = new int[n][n];
for(int i=0 ;i<n;i++)
{
for(int j=0;j<n;j++)
{
C1[i][j]=0;
}
}
putchess(0,C1);

}
public static void putchess(int row, int [][]C1) {
int [][]C2 = (int[][])C1.clone();
if(row==n)
{
count++;
System.out.println("第 "+count+" 种 ");
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
System.out.print(C2[i][j]);
}
System.out.println();
}
System.out.println();
return;
}
for(int i=0 ;i<n;i++)
{
if(Isdanger(row, i, C2)) {
for(int j=0;j<n;j++)
{
C2[row][j]=0;
}
C2[row][i]=1;
putchess(row+1, C2);//不要忘了递归要返回的,之前想不通的第一个矩阵如何到第二个矩阵的,就是因为它可以回溯,先到达最深,再回溯到倒数第二,以此倒着不断判定所有可能情况
}
}
}
}

深搜(隐式地)利用了栈(后进先出)进行计算,所以我的方法可能可以改进

4.KMP学习思路

不要尝试去反推

推荐学习网址https://www.cnblogs.com/-citywall123/p/11688576.html;

注意在有符号整型和无符号整型的比较中,自动将有符号整型数转换为无符号整型。

C++方法:

不要尝试理解kmp算法,与递归同理

下面是求Next数组的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<iostream>
#include<string>
using namespace std;
const int n = 1008;
string s;
int Next[n];
void aa()
{
Next[0]=-1;
int i = 0;
int j = -1;
while(i<=s.length())
{
if(j==-1||s[i]==s[j])
{
Next[++i]=++j;
}else
{
j=Next[j];
}
}

}
int main()
{
cin>>s;
aa();
for(int i=0;i<s.length();i++)
{
cout<<" "<<Next[i]<<" ";
}
return 0;
}

下面是全的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const int n=1e6+10;
int next1[n];
string re;
string te;
int re1,te1;

void get_ne()
{
int i=0;
int j=-1;
next1[0]=-1;
// i在前面,j在后面
while(i<te1)
{
if(j==-1||te[i]==te[j])
{
next1[++i]=++j;
}else{
j=next1[j];
}
}
}
int get_piace()
{
int i=0;
int j=0;
while(i<re1&&j<te1)
{
if(j==-1||te[j]==re[i])
{
i++;
j++;
}
else
{
j=next1[j];
}
}
if(j>=te1)
{
return i-te1+1;
}
else{
return -1;
}
}
int main()
{
cin>>re>>te;
re1=re.size();
te1=te.length();
get_ne();
cout<<"查找到的位置初始是:"<<get_piace()<<endl//由一开始的
return 0;
}

java方法:

实际上没啥区别,就再写一遍而已:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import java.util.Iterator;
import java.util.Scanner;

public class Main{
public static int N =1000000;
public static int Next[] =new int[N];
public static char TE[] =new char[N];
public static char RE[] =new char[N];
public static int re1;
public static int te1;
public static String re;
public static String te;
public static void get_next()
{
int j=-1;
int i=0;
Next[0]=-1;
while(i<te1)
{
if(j==-1||TE[i]==TE[j])
{
Next[++i]=++j;
}else {
j=Next[j];
}
}
}
public static int get_piace()
{
int i=0;int j=0;
while(i<re1&&j<te1)
{
if(j==-1||TE[j]==RE[i])
{
i++;
j++;
}else {
j=Next[j];
}

}
if(j>=te1)//这里当时没写等号
{
return i-te1+1;
}else {
return -1;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
re=scanner.nextLine();
te=scanner.nextLine();
RE=re.toCharArray();
TE=te.toCharArray();
re1 = re.length();
te1 = te.length();
get_next();
System.out.println(get_piace());


}
}