leetcode每日一题(20241210)本日依旧是棋盘类型的题目,但是本日的只是表面相关,看题:
935.骑士拨号器 题目形貌:
- 象棋骑士有一个独特的移动方式,它可以垂直移动两个方格,水平移动一个方格,或者水平移动两个方格,垂直移动一个方格(两者都形成一个 L 的形状)。
- 象棋骑士可能的移动方式如下图所示:
- 我们有一个象棋骑士和一个电话垫,如下所示,骑士只能站在一个数字单元格上(即蓝色单元格)。
- 给定一个整数 n,返回我们可以拨多少个长度为 n 的不同电话号码。
- 你可以将骑士放置在任何数字单元格上,然后你应该执行 n - 1 次移动来获得长度为 n 的号码。所有的跳跃应该是有效的骑士跳跃。
- 因为答案可能很大,所以输出答案模 109 + 7.
复制代码
这个题其实和题目没关系,把题目提炼一下就是,有一组数方向如下:
- 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[n+1][10];
- 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[step][num]!=0){
- return cache[step][num];
- }
- int count=0;
- for(int next:list.get(num)){
- count=(count+dfs(step+1,next))%mod;
- }
- return cache[step][num]=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企服之家,中国第一个企服评测及商务社交产业平台。 |