题解 | #拜访#

拜访

http://www.nowcoder.com/practice/12cbdcdf5d1e4059b6ddd420de6342b6

import java.util.*;
/**
 第一个解法在讨论区用的是最短路求方案
 第二个就是就是常见的dp
    这类题简化就是从左上角->右下角的方案问题,但是这题目麻烦在于 我们知道起点,但是终点却可能在四个方向 左上 左下 右上  右下
    我们只需要转成题目变成:固定起点在左上角,然后将终点固定到右下角,然后直接dp就好了

*/
public class Visit {
    public int countPath(int[][] map, int n, int m) {
         int[][] f = new int[n + 20][m + 20];
         int x1 = 1, y1 = 1, x2 = 1, y2 = 1;
         for(int i = 0; i < n; i ++){
             for(int j = 0; j < m; j ++)
                 if(map[i][j] == 1)
                 {
                     x1 = i; y1 = j;
                 }else  if(map[i][j] == 2){
                     x2 = i; y2 = j;
                 }
         }

         int dx = x1 > x2 ? -1 : 1;
         int dy = y1 > y2 ? -1 : 1;

         if(dx == -1)
             x2 = x1 - x2 + x1;  //数学推论 没有化简 
         if(dy == -1)
             y2 = y1- y2 + y1;  //数学推论 
         //一定是往下
        // x2 y2 固定到了右下角
        f[x1][y1] = 1;
         for(int i = x1; i <= x2; i ++){ 
             for(int j = y1; j <= y2; j ++){  
                 if(i - 1 >= x1)
                     f[i][j] += f[i - 1][j];
                 if(j - 1 >= y1)
                     f[i][j] += f[i][j - 1];
             }

         }


        return f[x2][y2];






    }
}
全部评论
对了 这里f[][]要需要设置稍微大一点~~
点赞 回复 分享
发布于 2021-07-30 10:05

相关推荐

01-17 08:34
门头沟学院 Java
想找对象的单身狗在努力存钱:这工资不低了,再高点人家要招博士硕士的
点赞 评论 收藏
分享
02-12 17:30
已编辑
字节跳动_实习生(实习员工)
要怎么办呢牛:我觉得大厂日常实习最大的意义就是给自己背书,一个好公司的实习就像一个好学历似的,能够给自己增加一个标签,让别人觉得你可以。(至于真正实习干了啥,这个感觉并不太重要)。当然一家之言,仅供参考。另外,楼主已经很强了,实习毕业双双拿下,已经领先好多好多人了,羡慕啊
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务