不同路径数

希望这篇题解对你有用,麻烦动动手指点个赞或关注,感谢您的关注~

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

考点秘籍

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

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

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

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

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

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

蓝桥杯必背第一期

蓝桥杯必背第二期

往期精彩回顾

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

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

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

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

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

蓝桥杯上岸每日N题 第四期(最少刷题数)!!!

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

蓝桥杯上岸每日N题 第六期(求阶乘)!!!

蓝桥杯上岸每日N题 第七期(小猫爬山)!!!

蓝桥杯上岸每日N题 第八期 (全球变暖)!!!

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

LeetCode Hot100 刷题(第三期)

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

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

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

填空题

竞赛干货

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

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

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

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

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

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

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

蓝桥杯上岸必背!!!(第八期 简单数论)

蓝桥杯上岸必刷!!!(进制、数位专题)

蓝桥杯上岸考点清单 (冲刺版)!!!

分析

不同路径数

不同路径数_第1张图片

关键句:走过的位置可以重复走
看到题目,我们可以发现每个任意的位置都可以往上下左右四个方向任意走。
再看到输出样例,发现走了k次后,得到的是不重复的k位组合数(k从0开始)
我们可以建立如下暴力搜索树
不同路径数_第2张图片

我们可以暴力搜索每个位置,每个位置都往上下左右方向k步即可。
再将走了k步的数字保存到set中,这样我们得到的是不重不漏的组合数
再把输出set.size()即可。

时间复杂度

n,m,k最大都为5
554^k*10=256000=O(2 x10^5)
是可以过的,可以不用快读快写,但是像BFS、DFS这些题目比赛时快读快写比较稳

小结

DFS通常与递归结合使用,从某个起点出发,限制操作次数
走到终点时进行相应的记录或者操作
一条路走到黑,暴力枚举结合递归各个方向或者操作。
像本题:
dfs(int x,int y,int u,int sum);
注:通常从起点0开始
满足条件的再递归下一层(下一个点)
dfs(x, y,u+1, sum);

ACcode(下标从0开始推荐)

//暴搜--->递归搜索树
//往上下左右四个方向走
import java.util.*;
public class Main{
    static int N=10;
    static int arr[][]=new int [N][N];
    static int dx[]={0,1,-1,0};
    static int dy[]={1,0,0,-1};
    static int n,m,k;
    static Set<Integer>set=new HashSet<>();
    //存的是每次走过的距离
    //不出现重复的距离
    public static void main(String []args){
        
        Scanner in =new Scanner(System.in);
         n=in.nextInt();
         m=in.nextInt();
         k=in.nextInt();
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                arr[i][j]=in.nextInt();
                 //bfs(i,j,0,arr[i][j]);
            }
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                bfs(i,j,0,arr[i][j]);
                //从i ,j 出发,u标记走的步数
            }
        }
        
        System.out.println(set.size());
    }
    public static void dfs(int x,int y,int u,int num){
        //确定边界
        if(u==k)set.add(num);
        else{
            //直接暴搜,四个方向都走一便,u走到k时将走过的距离存进set中。
            for(int i=0;i<4;i++){
            int a=x+dx[i];
            int b=y+dy[i];
            if(a>=0&&a<n&&b>=0&&b<m){
                //在范围内都可以走
                //秦九韶算法
                dfs(a,b,u+1,num*10+arr[a][b]);
            }
            }
       //return set.size(); 
    }
}
}

Accode2(下标从1开始)

import java.util.*;
public class Main{
    static int N=10;
    static int n,m,k;
    static int arr[][]=new int [N][N];
    static int dx[]={0,0,-1,0,1};
    static int dy[]={0,1,0,-1,0};
    static Set<Integer>set=new HashSet<>();
    public static void main(String []args){
        Scanner in = new Scanner(System.in);
        n=in.nextInt();
        m=in.nextInt();
        k=in.nextInt();
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                arr[i][j]=in.nextInt();
            }
        }
        int u=1;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                dfs(i,j,1,arr[i][j]);
            }
            
        }
        System.out.println(set.size());
        
    }
    public static void dfs(int x,int y,int u,int num){
        if(u==k+1)set.add(num);
        else{
            for(int i=1;i<=4;i++){
                int a=x+dx[i];
                int b=y+dy[i];
                if(a>=1&&a<=n&&b>=1&&b<=m){
                    dfs(a,b,u+1,10*num+arr[a][b]);
                }
            }
        }
    }
}

快读快写版

import java.util.*;
import java.io.*;
public class Main{
    static int N=10;
    static int n,m,k;
    static int arr[][]=new int [N][N];
    static int dx[]={0,-1,0,1};
    static int dy[]={1,0,-1,0};
    static Set<Integer>set=new HashSet<>();
    public static void main(String []args)throws IOException{
       // Scanner in = new Scanner(System.in);
    BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
    PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
    String str[]=bf.readLine().split(" ");
        n=Integer.parseInt(str[0]);
        m=Integer.parseInt(str[1]);
        k=Integer.parseInt(str[2]);
        for(int i=0;i<n;i++){
            String s[]=bf.readLine().split(" ");
            for(int j=0;j<m;j++){
                arr[i][j]=Integer.parseInt(s[j]);
            }
        }
        int u=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                dfs(i,j,0,arr[i][j]);
            }
            
        }
      pw.println(set.size());
      pw.flush();
    }
    public static void dfs(int x,int y,int u,int num){
        if(u==k)set.add(num);
        else{
            for(int i=0;i<4;i++){
                int a=x+dx[i];
                int b=y+dy[i];
                if(a>=0&&a<n&&b>=0&&b<m){
                    dfs(a,b,u+1,10*num+arr[a][b]);
                }
            }
        }
    }
}

你可能感兴趣的:(蓝桥杯上岸,蓝桥杯,java,算法,数据结构,dfs,深搜)