目录

  • 题目:935. Knight Dialer 骑士拨号器

    • 问题描述
  • 思路1
    • 算法实现
  • 思路2
    • 算法实现

题目:935. Knight Dialer 骑士拨号器

问题描述

国际象棋中的骑士可以按下图所示进行移动:

这一次,我们将 “骑士” 放在电话拨号盘的任意数字键(如上图所示)上,接下来,骑士将会跳 N-1 步。每一步必须是从一个数字键跳到另一个数字键。
每当它落在一个键上(包括骑士的初始位置),都会拨出键所对应的数字,总共按下 N 位数字。
你能用这种方式拨出多少个不同的号码?
因为答案可能很大,所以输出答案模 10^9 + 7

  • 示例 1:

    输入:1
    输出:10

  • 示例 2:

    输入:2
    输出:20

  • 示例 3:

    输入:3
    输出:46

  • 提示:

    1 <= N <= 5000

思路1

首先,我们来看下骑士在拨号盘上的走位

利用动态规划的思路,每一轮的结果都是由上一轮运算得到的(第一轮除外)

算法实现

  • 无法通过OJ
  • 思路是正确的,限于数据类型,求取更大的数值会溢出
class Solution {public int knightDialer(int N) {if (N == 1) return 10;// 第二轮 每个键位下一步数int[] jumpSizes = {2,2,2,2,3,0,3,2,2,2};// 临时存放 运算的值int[] tempSizes = new int[10];// 从底层开始 推理出顶层的答案for (int i = 2; i < N; i++) {giveNum(tempSizes,0, jumpSizes, 4, 6);giveNum(tempSizes,1, jumpSizes, 6, 8);giveNum(tempSizes,2, jumpSizes, 7, 9);giveNum(tempSizes,3, jumpSizes, 4, 8);giveNum(tempSizes,4, jumpSizes, 3, 9, 0);giveNum(tempSizes,6, jumpSizes, 1, 7, 0);giveNum(tempSizes,7, jumpSizes, 2, 6);giveNum(tempSizes,8, jumpSizes, 1, 3);giveNum(tempSizes,9, jumpSizes, 2, 4);tempSizes[5] = 0;// 更新当前轮次的结果jumpSizes = Arrays.copyOf(tempSizes, 10);}int sum = 0;for (int num : jumpSizes) sum += num;return sum;}void giveNum(int[] dest, int i, int[] src, int j, int k) {dest[i] = src[j] + src[k];}void giveNum(int[] dest, int i, int[] src, int j, int k, int p) {dest[i] = src[j] + src[k] + src[p];}
}
  • 可以通过OJ
  • 过程一样,只是改变数据类型,加上取模
class Solution {int mod = 1000000007;public int knightDialer(int N) {if (N == 1) return 10;// 将int改为long 数据不会溢出long[] jumpSizes = {2,2,2,2,3,0,3,2,2,2};long[] tempSizes = new long[10];long sum = 0;for (int i = 2; i < N; i++) {giveNum(tempSizes,0, jumpSizes, 4, 6);giveNum(tempSizes,1, jumpSizes, 6, 8);giveNum(tempSizes,2, jumpSizes, 7, 9);giveNum(tempSizes,3, jumpSizes, 4, 8);giveNum(tempSizes,4, jumpSizes, 3, 9, 0);giveNum(tempSizes,6, jumpSizes, 1, 7, 0);giveNum(tempSizes,7, jumpSizes, 2, 6);giveNum(tempSizes,8, jumpSizes, 1, 3);giveNum(tempSizes,9, jumpSizes, 2, 4);tempSizes[5] = 0;jumpSizes = Arrays.copyOf(tempSizes, 10);}for (long num : jumpSizes) sum += num;return (int)(sum%mod);}void giveNum(long[] dest, int i, long[] src, int j, int k) {// 每次求和后 都进行取模dest[i] = (src[j] + src[k]) % mod;}void giveNum(long[] dest, int i, long[] src, int j, int k, int p) {dest[i] = (src[j] + src[k] + src[p]) % mod;}
}

思路2

通过观察各键位的位置以及其运算轨迹,总结出规律



算法实现

class Solution {public int knightDialer(int N) {if (N == 1) return 10;int mod = 1000000007;// a表示四角的和// b表示中部左右的和// c表示中部上下的和// d表示0键位的值long a = 4, b = 2, c = 2, d = 1;for (int i = 1; i < N; i++) {long A = (2*(b+c)) % mod;long B = (a + 2*d) % mod;c = a;d = b;a = A;b = B;}return (int)((a+b+c+d)%mod);}
}

转载于:https://www.cnblogs.com/slowbirdoflsh/p/11284996.html

[leetcode] 935 Knight Dialer 骑士拨号器相关推荐

  1. [Swift]LeetCode935. 骑士拨号器 | Knight Dialer

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  2. LeetCode 935. 骑士拨号器(动态规划)

    文章目录 1. 题目 2. 解题 1. 题目 国际象棋中的骑士可以按下图所示进行移动: 这一次,我们将 "骑士" 放在电话拨号盘的任意数字键(如上图所示)上, 接下来,骑士将会跳 ...

  3. 【LeetCode】935. Knight Dialer 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划TLE 空间换时间,利用对称性 优化空间复杂 ...

  4. 935. 骑士拨号器

    国际象棋中的骑士可以按下图所示进行移动:  .            这一次,我们将 "骑士" 放在电话拨号盘的任意数字键(如上图所示)上,接下来,骑士将会跳 N-1 步.每一步必 ...

  5. leetcode算法题--骑士拨号器

    原题链接:https://leetcode-cn.com/problems/knight-dialer/ 方法一: 这题是基于"马"在棋盘上的概率,所以我们就按照"马&q ...

  6. 935.Knight Dialer [JavaScript]

    一.题目 A chess knight can move as indicated in the chess diagram below: This time, we place our chess ...

  7. leetcode-935-骑士拨号器-knightDialer

    leetcode-935-骑士拨号器-knightDialer package com.ant.learning.part1;import java.util.Arrays; import java. ...

  8. android手机拨号器实现

    总共分为4个部分:string值,Layout布局设计,MainActivity代码编写,给项目添加使用授权. 1. string值 Phone-->res-->values-->s ...

  9. Android入门——电话拨号器和4种点击事件

    关于HelloWorld为,电话拨号程序还AndroidA入门demo,从这个样例我们要理清楚做安卓项目的思路. 大体分为三步: 1.理解需求,理清思路 2.设计UI 3.代码实现 电话拨号器 1.  ...

  10. Android 拨号器

    2019独角兽企业重金招聘Python工程师标准>>> 一.实现思路: 1.实现界面,界面上有EditText  控件, Button 控件 2.资源文件 values 下创建str ...

最新文章

  1. 认识Axure的软件界面
  2. git 在ssh情况下提交代码
  3. 2020-2021家居行业年度盘点与趋势洞察
  4. tolua#是Unity静态绑定lua的一个解决方案
  5. python 一组数据 正态分布散点图_python高维数据型图表矩阵散点图
  6. mysql优化教程_Mysql优化一
  7. jsbridge实现及原理_Hybrid APP基础篇(四)-JSBridge的原理
  8. python实例 输出你好
  9. AJAX和CGI 技术的应用
  10. 神经网络利用哪种算法将损失函数的值降到最低
  11. Qt|layout布局相关,layout属性的含义及使用
  12. wx:if 与wx:else
  13. input输入字符限制
  14. 软件需求工程--需求分析
  15. 如何使用markdown做笔记
  16. ajax put 请求
  17. 金蝶显示连接云服务器异常,金蝶提示连接云服务器异常
  18. css ---border边框语法
  19. 内蒙古职称计算机考试文件,2017年内蒙古职称计算机考试复习:word2003(三)
  20. SketchUp:SketchUp草图大师经典案例之利用推拉工具实现对齐高度图文教程

热门文章

  1. 根据地址查询经纬度Js
  2. python3安装库报错ERROR: Exception: Traceback (most recent call last): File “A:\ProgramData\Anacon
  3. PC上无法捕捉vlan tag的原因
  4. java出现报错java.lang.IndexOutOfBoundsException
  5. html怎么动态背景,HTML 动态背景
  6. 大道至简(周爱民)第二章-----读后感
  7. <C++>多继承以及典型的菱形继承案例
  8. HCIA网络基础17-HDLC和PPP
  9. uC/OS II移植
  10. 杨澜创建中国职场女性社区天女网