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