原题链接:蓝桥杯2014年第五届真题-地宫取宝
解题思路:
每次行动判断下一步,
1、如果在边上,那么只有一个方向能走,所怀有最大gold大于当前物品,就只有一条路走,就是不拿,向唯一方向行动
2、跟1,不过最大gold小于当前,两条路,拿还是不拿
3、如果不在边上,两个方向,判断gold,如果大于,两条路,都是不拿走
4、跟3,不过最大gold小于当前,两个方向两种拿法,共四条路。
使用回溯,
终止条件,在右下角的时候判断
只跑出了示例,提交没跑出来,超时了。。。。。。。。
注意事项:
参考代码:
static int s = 0; static int mod = 1000000007; static int n; static int m; static int k; public static void main(String[] args) { Scanner in = new Scanner(System.in); n = in.nextInt(); m = in.nextInt(); k = in.nextInt(); int[][] arr = new int[n][m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { arr[i][j] = in.nextInt(); } } //数组,坐标(用于检查是否是最后一点),最大值(用于判断行动), huisu(arr,0,0,0,0); System.out.println(s); } private static void huisu(int[][] arr, int i, int j, int g, int c) { //减枝,当所有物品大于k了,你肯定完成不了任务,因为你没有丢弃选项。 if (c>k){ return; } //终止条件 if (i==n-1&&j==m-1){ if (c==k){ s++; s=s%mod; return; }else if (c==k-1&&g<arr[i][j]){ s++; s=s%mod; return; } return; } //在边上 if (i==n-1&&j<m-1){ if (g>=arr[i][j]){ huisu(arr,i,j+1,g,c); return; } huisu(arr,i,j+1,g,c); huisu(arr,i,j+1,arr[i][j],c+1); return; } //在边上 if (j==m-1&&i<n-1){ if (g>=arr[i][j]){ huisu(arr,i+1,j,g,c); return; } huisu(arr,i+1,j,g,c); huisu(arr,i+1,j,arr[i][j],c+1); return; } //不在边上 if (g>=arr[i][j]){ huisu(arr,i,j+1,g,c); huisu(arr,i+1,j,g,c); return; } huisu(arr,i,j+1,g,c); huisu(arr,i,j+1,arr[i][j],c+1); huisu(arr,i+1,j,g,c); huisu(arr,i+1,j,arr[i][j],c+1); return; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复