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});
}
}
加油!!!