不同路径数

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

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

考点秘籍

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

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

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

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

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

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

蓝桥杯必背第一期

蓝桥杯必背第二期

往期精彩回顾

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

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

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

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

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

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

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

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

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

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

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

LeetCode Hot100 刷题(第三期)

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

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

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

填空题

竞赛干货

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

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

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

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

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

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

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

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

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

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

分析

不同路径数

在这里插入图片描述

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

我们可以暴力搜索每个位置,每个位置都往上下左右方向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]);
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寸 铁

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值