希望这篇题解对你有用,麻烦动动手指点个赞或关注,感谢您的关注~
不清楚蓝桥杯考什么的点点下方👇
考点秘籍
想背纯享模版的伙伴们点点下方👇
蓝桥杯省一你一定不能错过的模板大全(第一期)
蓝桥杯省一你一定不能错过的模板大全(第二期)
蓝桥杯省一你一定不能错过的模板大全(第三期)
蓝桥杯省一你一定不能错过的模板大全(第四期)!!!
想背注释模版的伙伴们点点下方👇
蓝桥杯必背第一期
蓝桥杯必背第二期
往期精彩回顾
蓝桥杯上岸每日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]);}}}}
}