关注
第一题动态规划解法,代码没优化,中间还有调试用的输出,额,有点长。大体思想,先求出(0,0)到各个点的最大剩余体力,然后从(0,m)开始倒推路径。
import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
int m = sc.nextInt();
int P = sc.nextInt();
int[][] nums = new int[n][m];
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
nums[i][j] = sc.nextInt();
}
}
if(n == 1){
System.out.println(P - m + 1);
}
if(m == 1){
System.out.println(P);
}
int[][] tili = new int[n][m];
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
tili[i][j] = -1;
}
}
getSolution(nums, tili, P);
dis(nums);
System.out.println("tili");
dis(tili);
findPath(nums, tili);
}
}
public static void getSolution(int[][] nums, int[][] tili ,int P){
int n = nums.length;
int m = nums[0].length;
tili[0][0] = P;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(nums[i][j] == 0){
continue;
}
update(nums, tili, i, j);
}
}
}
public static void update(int[][] nums, int[][] tili, int i, int j){
if(tili[i][j] <= 0){
return;
}
if(i>0){
if(nums[i-1][j] == 1){
int p = tili[i][j] - 3;
if(tili[i-1][j] < p){
tili[i-1][j] = p;
update(nums, tili, i-1, j);
}
}
}
if(i<nums.length-1){
if(nums[i+1][j] == 1){
int p = tili[i][j];
if(tili[i+1][j] < p){
tili[i+1][j] = p;
update(nums, tili, i+1, j);
}
}
}
if(j > 0){
if(nums[i][j-1] == 1){
int p = tili[i][j] - 1;
if(tili[i][j-1] < p){
tili[i][j-1] = p;
update(nums, tili, i, j-1);
}
}
}
if(j < nums[0].length-1)
{
if(nums[i][j+1] == 1){
int p = tili[i][j] - 1;
if(tili[i][j+1] < p){
tili[i][j+1] = p;
update(nums, tili, i, j+1);
}
}
}
}
public static void findPath(int[][] nums, int[][] tili){
int n = tili.length;
int m = tili[0].length;
if(tili[0][m-1] == -1){
System.out.println("Can not escape!");
}
Stack<String> stack = new Stack<String>();
String str = "[0," + (m-1) + "]";
stack.push(str);
findnext(tili, 0, m-1, stack);
while(!stack.isEmpty()){
System.out.print(stack.pop());
if(!stack.isEmpty()){
System.out.print(",");
}
}
}
public static void findnext(int[][] tili, int i, int j, Stack<String> s){
if(i==0 && j==0){
// String str = "[0,0]";
// s.push(str);
return;
}
int up=0, down=0, left=0, right=0;
int cur = tili[i][j];
if(i > 0){
up = tili[i-1][j];
if(up == cur){
String str = "[" + (i-1) + "," + j + "]";
s.push(str);
findnext(tili, i-1, j, s);
return;
}
}
if(i < tili.length-1){
down = tili[i+1][j];
if(cur == down - 3){
String str = "[" + (i+1) + "," + j + "]";
s.push(str);
findnext(tili, i+1, j, s);
return;
}
}
if(j >0){
left = tili[i][j-1];
if(cur == left - 1){
String str = "[" + (i) + "," + (j-1) + "]";
s.push(str);
findnext(tili, i, j-1, s);
return;
}
}
if(j < tili[0].length-1){
right = tili[i][j+1];
if(cur == right - 1){
String str = "[" + (i) + "," + (j+1) + "]";
s.push(str);
findnext(tili, i, j+1, s);
return;
}
}
}
public static void dis(int[][] nums){
for(int i=0; i<nums.length; i++){
System.out.println(Arrays.toString(nums[i]));
}
}
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
10-14 14:35
门头沟学院 硬件开发 点赞 评论 收藏
分享
牛客热帖
更多
- 1... 面试最后的反问环节,能问些什么?(附特供问题)2.6W
- 2... BG一般,如何逆天改命拿下后端秋招SSP?1.3W
- 3... 从面试官的角度看待一场面试是怎么样的?8590
- 4... 害,找工作哪有不上当的!5669
- 5... 团、节、东孝子全部启动启动启动!(26届后端秋招总结)4535
- 6... 27届北漂实习day1(极致省钱版)4365
- 7... 项目经历混乱?STAR法则手把手教你梳理(附真实案例分析过程)4138
- 8... 双非硕的十月份秋招总结3931
- 9... 作为普通家庭出身的我,为什么非大厂不可?3901
- 10... 待了一年,一点没亏3754
正在热议
更多
# 实习在多还是在精 #
27161次浏览 204人参与
# 你的房租占工资的比例是多少? #
62420次浏览 789人参与
# 智慧芽求职进展汇总 #
872次浏览 5人参与
# 秋招踩过的“雷”,希望你别再踩 #
65785次浏览 924人参与
# 为什么国企只招应届生 #
206262次浏览 1230人参与
# 你见过哪些工贼行为 #
13283次浏览 80人参与
# 未岚大陆求职进展汇总 #
4286次浏览 59人参与
# 我的求职进度条 #
51799次浏览 796人参与
# 实习下班不想学习,正常吗? #
15338次浏览 154人参与
# 24届的你们现状如何了? #
97910次浏览 508人参与
# 反问环节如何提问 #
113506次浏览 2397人参与
# 校招谈薪一定要知道的事 #
10635次浏览 98人参与
# 如果不考虑收入,你最想做什么工作? #
31592次浏览 181人参与
# 顺丰求职进展汇总 #
62298次浏览 310人参与
# 找工作中的小确幸 #
22410次浏览 211人参与
# 小马智行求职进展汇总 #
12605次浏览 49人参与
# 你觉得什么岗位会被AI替代 #
13412次浏览 154人参与
# 我的租房踩坑经历 #
175335次浏览 1137人参与
# 通信硬件公司爆料 #
168195次浏览 536人参与
# 牛客租房专区 #
118011次浏览 1334人参与
# 华为池子有多大 #
102377次浏览 733人参与
# 工作中,努力重要还是选择重要? #
205216次浏览 2081人参与