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 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在不踩泥的情况下到达文瀛餐厅所需的最小距离。
代码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; }; 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; 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; 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{ public static LinkedList<Q> que = new LinkedList<Main.Q>(); 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; 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()); } }
|