蓝桥杯省一你一定不能错过的模板大全(第三期)

大家好 我是寸铁

冲刺蓝桥杯省一模板大全来啦

蓝桥杯4月8号就要开始了

距离蓝桥杯省赛倒数第4天 ❗️ ❗️ ❗️

还没背熟模板的伙伴们背起来

真题千千万万遍,蓝桥省一自然现! ✌️

日更3000里,蓝桥眷顾你

祝大家4月8号蓝桥杯上岸 ☀️ ~

还没背熟模板的伙伴们背起来

祝大家4月8号蓝桥杯上岸 ☀️

不清楚蓝桥杯考什么的点点下方

考点秘籍

想背纯享模版的伙伴们点点下方

蓝桥杯省一你一定不能错过的模板大全(第一期)

蓝桥杯省一你一定不能错过的模板大全(第二期)

想背注释模版的伙伴们点点下方

蓝桥杯必背第一期

蓝桥杯必背第二期

往期精彩回顾

蓝桥杯上岸每日N题 第一期(一)!!!

蓝桥杯上岸每日N题第一期(二)!!!

蓝桥杯上岸每日N题第一期(三)!!!

蓝桥杯上岸每日N题第二期(一)!!!

蓝桥杯上岸每日N题第三期(一)!!!

操作系统期末题库 第九期(完结)

LeetCode Hot100 刷题(第三期)

idea创建SpringBoot项目报错解决方案

数据库SQL语句(期末冲刺)

想看JavaB组填空题的伙伴们点点下方

填空题

竞赛干货

算法竞赛字符串常用操作大全

蓝桥杯上岸必刷!!!(模拟/枚举专题)

蓝桥杯上岸必背!!! (第三期 DP)

蓝桥杯上岸必背!!!(第四期DFS)

蓝桥杯上岸必背!!!(第五期BFS)

蓝桥杯上岸必背!!!(第六期树与图的遍历)

蓝桥杯上岸必背!!!(第七期 最短路算法)


前言

考虑到部分同学觉得题解版背模板觉得比较不方便,整理纯模板放便大家背 ✌️ ~

题解也被我单独切出来,需要直接点击查看即可,是不是很贴心

DFS

排列数字

题解

import java.util.*;
public class Main{
    static int n;
    static boolean st[]=new boolean[10];
    static int a[]=new int[10];
    public static void main(String []args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        dfs(0);
    }
    public static void dfs(int u){
        if(u==n){
            for(int i=0;i<n;i++){
                System.out.print(a[i]+" ");
            }
            System.out.println();
        }
        for(int i=1;i<=n;i++){
            if(!st[i]){
                a[u]=i;
                st[i]=true;
                dfs(u+1);
                st[i]=false;
            }
        }
        
        
    }
    
    
}

n-皇后问题

题解

import java.util.*;
public class Main{
    static int N=10;
    static char g[][]=new char [N][N];
    static boolean col[]=new boolean[N];
    static boolean row[]=new boolean[N];
    static boolean dg[]=new boolean[2*N];
    static boolean udg[]=new boolean [2*N];
    static int n;
    public static void main(String []args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        dfs(0,0,0);
    }
    public static void dfs(int x,int y,int s){
        if(s>n)return;
        if(y==n){
            y=0;
            x++;
        }
        if(x==n){
            if(s==n){
                for(int i=0;i<n;i++){
                    for(int j=0;j<n;j++){
                        System.out.print(g[i][j]);
                    }
                    System.out.println();
                }
                System.out.println();
            }
            return;
        }
        g[x][y]='.';
        dfs(x,y+1,s);
        if(!row[x]&&!col[y]&&!dg[x+y]&&!udg[x-y+n]){
            g[x][y]='Q';
            row[x]=col[y]=dg[x+y]=udg[x-y+n]=true;
            dfs(x,y+1,s+1);
            row[x]=col[y]=dg[x+y]=udg[x-y+n]=false;
            g[x][y]='.';
        }
        
        
    }
}

BFS

走迷宫

题解

import java.util.*;
public class Main{
    static int N=110;
    static int n,m;
    static PII q[]=new PII[N*N];
    static int d[][]=new int[N][N];
    static int dx[]={0,1,-1,0};
    static int dy[]={1,0,0,-1};
    static int g[][]=new int[N][N];
    static int  hh,tt;
    public static int bfs(){
        hh=0;
        tt=-1;
        q[++tt]=new PII(0,0);
        d[0][0]=0;
        while(hh<=tt){
            PII t=q[hh++];
            for(int i=0;i<4;i++){
            int a=t.x+dx[i];
            int b=t.y+dy[i];
            if(a>=0&&a<=n&&b>=0&&b<=m&&d[a][b]==-1&&g[a][b]==0){
                d[a][b]=d[t.x][t.y]+1;
                q[++tt]=new PII(a,b);
                
            }
            }
            
            
        }
        return d[n-1][m-1];
        
        
    }
    public static void main(String []args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                g[i][j]=sc.nextInt();
                d[i][j]=-1;
            }
        }
        System.out.println(bfs());
    }
    
    
}
class PII{
    int x;
    int y;
    public PII(int x,int y){
        this.x=x;
        this.y=y;
    }
}

八数码

题解

import java.util.*;
public class Main{
    public static void swap(char arr[],int x,int y){
        char temp=arr[x];
        arr[x]=arr[y];
        arr[y]=temp;
    }
    public static int bfs(String start ,String end){
        Map<String,Integer>map=new HashMap<>();
        //存一个键值对映射
        Queue<String >q=new LinkedList<>();
        q.offer(start);
        map.put(start,0);
        int dx[]={-1,0,1,0};
        int dy[]={0,1,0,-1};
        while(!q.isEmpty()){
        String t=q.poll();
        int k=t.indexOf('x');
        int x=k/3;
        int y=k%3;
        if(t.equals(end))return map.get(t);
        for(int i=0;i<4;i++){
            int a=x+dx[i];
            int b=y+dy[i];
            if(a<3&&a>=0&&b<3&&b>=0){
                char []str=t.toCharArray();
                swap(str,k,a*3+b);
                String s=new String(str);
                if(map.get(s)==null){
                    map.put(s,map.get(t)+1);
                    q.offer(s);
                }
            }
            
        }
    }
    return -1;
    }
    public static void main(String []args){
        Scanner in = new Scanner(System.in);
        String start="";
        for(int i=0;i<9;i++){
            String x=in.next();
            start+=x;
        }
        String end="12345678x";
        System.out.println(bfs(start,end));
    }
}

树与图的深度优先遍历

模板题

题解

import java.util.*;
public class Main{
    static int N=100010;
    static int e[]=new int[N*2];
    static int ne[]=new int[N*2];
    static int h[]=new int[N];
    static boolean st[]=new boolean[N];
    static int ans=0x3f3f3f3f,idx,n;
    public static void add(int a,int b){
        e[idx]=b;
        ne[idx]=h[a];
        h[a]=idx;
        idx++;
    }
    public static int dfs(int u){
        int sum=1;
        int res=0;
        st[u]=true;
        for(int i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            if(!st[j]){
                int s=dfs(j);
                res=Math.max(s,res);
                sum+=s;
            }
        }
        res=Math.max(res,n-sum);
        ans=Math.min(ans,res);
        return sum;
    }
    public static void main (String []args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        Arrays.fill(h,-1);
        for(int i=0;i<n-1;i++){
            int a=sc.nextInt();
            int b=sc.nextInt();
            add(a,b);
            add(b,a);
    }
    dfs(1);
    System.out.println(ans);
}
}

树与图的广度优先遍历

模板题

题解

import java.util.*;
public class Main{
    static int N=100010;
    static int e[]=new int[N];
    static int ne[]=new int[N];
    static int d[]=new int[N];
    static int q[]=new int[N];
    static int h[]=new int[N];
    static int idx,n,m,hh,tt;
    public static void add(int a,int b){
        e[idx]=b;
        ne[idx]=h[a];
        h[a]=idx;
        idx++;   
        
    }
    public static int bfs(){
        hh=0;
        tt=-1;
        q[++tt]=1;
        d[1]=0;
        while(hh<=tt){
            int t=q[hh++];
        for(int i=h[t];i!=-1;i=ne[i]){
            int j=e[i];
            if(d[j]==-1){
                d[j]=d[t]+1;
                q[++tt]=j;
            }
        }
    }
    return d[n];
    }
    public static void main(String []args){
        Scanner sc=new Scanner(System.in);
         n=sc.nextInt();
         m=sc.nextInt();
        Arrays.fill(h,-1);
        Arrays.fill(d,-1);
        for(int i=0;i<m;i++){
            int a=sc.nextInt();
            int b=sc.nextInt();
            add(a,b);
        }
        System.out.println(bfs());
    }
}

java容器类:Queue

import java.util.*;
public class Main{
    static int N=100010;
    static int e[]=new int[N];
    static int ne[]=new int[N];
    static int d[]=new int[N];
    static int q[]=new int[N];
    static int h[]=new int[N];
    static int idx,n,m,hh,tt;
    public static void add(int a,int b){
        e[idx]=b;
        ne[idx]=h[a];
        h[a]=idx;
        idx++;   
        
    }
    public static int bfs(){
        Queue<Integer>q=new LinkedList<Integer>();
        q.add(1);
        d[1]=0;
        while(!q.isEmpty()){
            int t=q.poll();
        for(int i=h[t];i!=-1;i=ne[i]){
            int j=e[i];
            if(d[j]==-1){
                d[j]=d[t]+1;
                q.add(j);
            }
        }
    }
    return d[n];
    }
    public static void main(String []args){
        Scanner sc=new Scanner(System.in);
         n=sc.nextInt();
         m=sc.nextInt();
        Arrays.fill(h,-1);
        Arrays.fill(d,-1);
        for(int i=0;i<m;i++){
            int a=sc.nextInt();
            int b=sc.nextInt();
            add(a,b);
        }
        System.out.println(bfs());
    }
}

Dijkstra朴素版

Dijkstra求最短路I

题解

import java.util.*;
public class Main{
    static int N=510,n,m,INF=0x3f3f3f3f;
    static int g[][]=new int[N][N];
    static int dist[]=new int[N];
    static boolean st[]=new boolean[N];
    public static int dijkstra(){
        Arrays.fill(dist,INF);
        dist[1]=0;
        for(int i=0;i<n;i++){
            int t=-1;
            for(int j=1;j<=n;j++){
            if(!st[j]&&(t==-1||dist[j]<dist[t])){
                t=j;
            }
        }
        st[t]=true;
        for(int j=1;j<=n;j++){
            dist[j]=Math.min(dist[j],dist[t]+g[t][j]);
            
        }
    }
    if(dist[n]==INF)return -1;
    return dist[n];
    }
    
    public static void main(String []args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        for(int i=1;i<=n;i++){
            Arrays.fill(g[i],INF);
        }
        while(m-->0){
            int a=sc.nextInt();
            int b=sc.nextInt();
            int c=sc.nextInt();
            g[a][b]=Math.min(g[a][b],c);
        }
           System.out.println(dijkstra());
    }
}

Dijkstra求最短路II

题解

import java.io.*;
import java.util.*;
public class Main{
	static int N=150010,idx,n,m;
	static int dist[]=new int[N];
	static int h[]=new int[N],e[]=new int[N],ne[]=new int[N],w[]=new int[N];
	static boolean st[]=new boolean[N];
	static int INF=0x3f3f3f3f;
	public static void add(int a,int b, int  c) {
		e[idx]=b;
		w[idx]=c;
		ne[idx]=h[a];
		h[a]=idx++;
	}
	public static int dijkstra() {
		PriorityQueue<PIIs>queue=new PriorityQueue<>();
		Arrays.fill(dist, INF);
		dist[1]=0;
		queue.add(new PIIs(0,1));
		//第一个是距离,后一个是点。
		while(!queue.isEmpty()) {
			PIIs p= queue.poll();
			int t=p.getSecond();
			int distance=p.getFirst();
			if(st[t])continue;
			st[t]=true;
			for(int i=h[t];i!=-1;i=ne[i]) {
				int j=e[i];
				if(dist[j]>distance+w[i]) {
					dist[j]=distance+w[i];
					queue.add(new PIIs(dist[j],j));
				}
			}
		}
		if(dist[n]==INF)return -1;
		else return dist[n];
	}
	public static void main(String []args) throws IOException {
		BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
		String []str=bf.readLine().split(" ");
		n=Integer.parseInt(str[0]);
		m=Integer.parseInt(str[1]);
		Arrays.fill(h, -1);
		while(m-->0) {
			String s[]=bf.readLine().split(" ");
			int a=Integer.parseInt(s[0]);
			int b=Integer.parseInt(s[1]);
			int c=Integer.parseInt(s[2]);
			add(a,b,c);
		}
		System.out.println(dijkstra());
		
	}
}
	class PIIs implements Comparable<PIIs>{
		private int first;
		private int second;
		public int getFirst() {
			
			return this.first;
		}
		public int getSecond() {
			return this.second;
			
		}
		public PIIs(int first,int second) {
			this.first=first;
			this.second=second;
			
		}
		//按数字首位字典序排序
		public int compareTo(PIIs o) {
			return Integer.compare(first, o.first);
			
		}
	}

spfa求最短路

import java.util.*;
public class Main{
    static int N=100010,INF=0x3f3f3f3f;
    static int e[]=new int[N];
    static int ne[]=new int[N];
    static int w[]=new int[N];
    static int h[]=new int[N];
    static int dist[]=new int[N];
    static boolean st[]=new boolean[N];
    static int n,m,idx;
    public static void add(int a,int b,int c){
        e[idx]=b;
        w[idx]=c;
        ne[idx]=h[a];
        h[a]=idx;
        idx++;
    }
   public static void spfa(){
       Queue<Integer>q=new LinkedList<Integer>();
       Arrays.fill(dist,INF);
       q.offer(1);
       st[1]=true;
       dist[1]=0;
       while(!q.isEmpty()){
           int t=q.poll();
           st[t]=false;
       for(int i=h[t];i!=-1;i=ne[i]){
           int j=e[i];
           if(dist[j]>dist[t]+w[i]){
               dist[j]=dist[t]+w[i];
               if(!st[j]){
                   q.offer(j);
                   st[j]=true;
               }
           }
       }
   }
   if(dist[n]==INF)System.out.println("impossible");
   else System.out.println(dist[n]);
   }
      
    public static void main(String []args){
        Scanner sc=new Scanner(System.in);
        Arrays.fill(h,-1);
        n=sc.nextInt();
        m=sc.nextInt();
        while(m-->0){
            int a=sc.nextInt();
            int b=sc.nextInt();
            int c=sc.nextInt();
            add(a,b,c);
            
        }
        spfa();
        
        
        
    }
}

✨ ✨ ✨
看到这里,不妨点个关注

你可能感兴趣的:(蓝桥杯上岸,蓝桥杯,leetcode,算法,java,经验分享,数据结构,模板大全)