天津储鑫盛钢材现货供应商 发表于 2024-12-11 11:41:26

leetcode每日一题(20241210)

leetcode每日一题(20241210)本日依旧是棋盘类型的题目,但是本日的只是表面相关,看题:
935.骑士拨号器 题目形貌:
象棋骑士有一个独特的移动方式,它可以垂直移动两个方格,水平移动一个方格,或者水平移动两个方格,垂直移动一个方格(两者都形成一个 L 的形状)。
象棋骑士可能的移动方式如下图所示:
我们有一个象棋骑士和一个电话垫,如下所示,骑士只能站在一个数字单元格上(即蓝色单元格)。
给定一个整数 n,返回我们可以拨多少个长度为 n 的不同电话号码。
你可以将骑士放置在任何数字单元格上,然后你应该执行 n - 1 次移动来获得长度为 n 的号码。所有的跳跃应该是有效的骑士跳跃。
因为答案可能很大,所以输出答案模 109 + 7.
https://i-blog.csdnimg.cn/direct/de8e45f646874ca9ae80f8ce76cf079f.png
这个题其实和题目没关系,把题目提炼一下就是,有一组数方向如下:
0--->{4,6}               4--->{3,9,0}
1--->{6,8}               5---->{}   
2--->{7,9}               6--->{1,7,0}
3--->{4,8}               7--->{2,6}
8--->{1,3}               9--->{2,4}
给定长度,可以任意选起始元素,求有多少大概,看代码:
class Solution {
    List<int[]> list=new ArrayList<>();
    int n;
    int mod=1000000007;
    int[][] cache;
    public int knightDialer(int n) {
      this.n=n;
      cache=new int;
      initList();
      int count=0;
      for(int i=0;i<=9;i++){
            count=(count+dfs(1,i))%mod;
      }
      return count;
    }
    public int dfs(int step,int num){
      if(step==n){
            return 1;
      }
      if(cache!=0){
            return cache;
      }
      int count=0;
      for(int next:list.get(num)){
            count=(count+dfs(step+1,next))%mod;
      }
      return cache=count;
    }


    public void initList(){
      list.add(new int[]{4,6});
      list.add(new int[]{6,8});
      list.add(new int[]{7,9});
      list.add(new int[]{4,8});
      list.add(new int[]{3,9,0});
      list.add(new int[]{});
      list.add(new int[]{1,7,0});
      list.add(new int[]{2,6});
      list.add(new int[]{1,3});
      list.add(new int[]{2,4});
    }
}
加油!!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: leetcode每日一题(20241210)