2021-02-22:一个象棋的棋盘,然后把整个棋盘放入第一象限,棋盘的最左下角是(0,0)位置,那么整个棋盘就是横坐标上9条线、纵坐标上10条线的区域。给你三个 参数 x,y,k。返回“马”从(0,0)位置出发,必须走k步。最后落在(x,y)上的方法数有多少种?

福哥答案2021-02-22:

自然智慧即可。

1.递归。有代码。

2.记忆化搜索。有代码。

3.动态规划。dp是三维数组。棋盘是二维数组,走k步,需要k+1个棋盘。有代码。

4.动态规划,空间压缩。只有相邻棋盘才有依赖,所以只需要用两个棋盘,就能走完。有代码。

代码用golang编写,代码如下:

package main

import "fmt"

func main() {

    a := 3
b := 4
k := 5
fmt.Println("1.递归:", jump1(a, b, k))
fmt.Println("---")
fmt.Println("2.记忆化搜索:", jump2(a, b, k))
fmt.Println("---")
fmt.Println("3.动态规划:", jump3(a, b, k))
fmt.Println("---")
fmt.Println("4.动态规划,空间压缩:", jump4(a, b, k))
} func jump1(a int, b int, k int) int {
return process1(0, 0, k, a, b)
}
func process1(x int, y int, rest int, a int, b int) int {
if x < 0 || x >= 9 || y < 0 || y >= 10 {
return 0
}
if rest == 0 {
if x == a && y == b {
return 1
} else {
return 0
}
}
ways := process1(x+2, y+1, rest-1, a, b)
ways += process1(x+2, y-1, rest-1, a, b)
ways += process1(x-2, y+1, rest-1, a, b)
ways += process1(x-2, y-1, rest-1, a, b)
ways += process1(x+1, y+2, rest-1, a, b)
ways += process1(x+1, y-2, rest-1, a, b)
ways += process1(x-1, y+2, rest-1, a, b)
ways += process1(x-1, y-2, rest-1, a, b)
return ways
} func jump2(a int, b int, k int) int {
dp := make([][][]int, 10)
for i := 0; i < 10; i++ {
dp[i] = make([][]int, 9)
for j := 0; j < 9; j++ {
dp[i][j] = make([]int, k+1)
for m := 0; m < k+1; m++ {
dp[i][j][m] = -1
}
}
}
return process2(0, 0, k, a, b, dp)
}
func process2(x int, y int, rest int, a int, b int, dp [][][]int) int {
if x < 0 || x >= 10 {
return 0
}
if y < 0 || y >= 9 {
return 0
}
if dp[x][y][rest] != -1 {
return dp[x][y][rest]
}
if rest == 0 {
if x == a && y == b {
dp[x][y][rest] = 1
return 1
} else {
dp[x][y][rest] = 0
return 0
}
}
ways := process2(x+2, y+1, rest-1, a, b, dp)
ways += process2(x+2, y-1, rest-1, a, b, dp)
ways += process2(x-2, y+1, rest-1, a, b, dp)
ways += process2(x-2, y-1, rest-1, a, b, dp)
ways += process2(x+1, y+2, rest-1, a, b, dp)
ways += process2(x+1, y-2, rest-1, a, b, dp)
ways += process2(x-1, y+2, rest-1, a, b, dp)
ways += process2(x-1, y-2, rest-1, a, b, dp)
dp[x][y][rest] = ways
return ways } func jump3(a int, b int, k int) int {
dp := make([][][]int, 10)
for i := 0; i < 10; i++ {
dp[i] = make([][]int, 9)
for j := 0; j < 9; j++ {
dp[i][j] = make([]int, k+1)
}
}
dp[a][b][0] = 1
for rest := 1; rest <= k; rest++ {
for x := 0; x < 10; x++ {
for y := 0; y < 9; y++ {
ways := pick3(x+2, y+1, rest-1, dp)
ways += pick3(x+1, y+2, rest-1, dp)
ways += pick3(x-1, y+2, rest-1, dp)
ways += pick3(x-2, y+1, rest-1, dp)
ways += pick3(x-2, y-1, rest-1, dp)
ways += pick3(x-1, y-2, rest-1, dp)
ways += pick3(x+1, y-2, rest-1, dp)
ways += pick3(x+2, y-1, rest-1, dp)
dp[x][y][rest] = ways
}
}
}
return dp[0][0][k]
}
func pick3(x int, y int, rest int, dp [][][]int) int {
if x < 0 || x >= 10 || y < 0 || y >= 9 {
return 0
}
return dp[x][y][rest]
} func jump4(a int, b int, k int) int {
dp := make([][][]int, 10)
for i := 0; i < 10; i++ {
dp[i] = make([][]int, 9)
for j := 0; j < 9; j++ {
dp[i][j] = make([]int, 2)
}
}
dp[a][b][0] = 1
for rest := 1; rest <= k; rest++ {
for x := 0; x < 10; x++ {
for y := 0; y < 9; y++ {
ways := pick4(x+2, y+1, dp)
ways += pick4(x+1, y+2, dp)
ways += pick4(x-1, y+2, dp)
ways += pick4(x-2, y+1, dp)
ways += pick4(x-2, y-1, dp)
ways += pick4(x-1, y-2, dp)
ways += pick4(x+1, y-2, dp)
ways += pick4(x+2, y-1, dp)
dp[x][y][1] = ways
}
}
for i := 0; i < 10; i++ {
for j := 0; j < 9; j++ {
dp[i][j][0], dp[i][j][1] = dp[i][j][1], 0
}
}
}
return dp[0][0][0]
}
func pick4(x int, y int, dp [][][]int) int {
if x < 0 || x >= 10 || y < 0 || y >= 9 {
return 0
}
return dp[x][y][0]
}

执行结果如下:


左神java代码

评论

2021-02-22:一个象棋的棋盘,然后把整个棋盘放入第一象限,棋盘的最左下角是(0,0)位置,那么整个棋盘就是横坐标上9条线、纵坐标上10条线的区域。给你三个 参数 x,y,k。返回“马”从(0,0)位置出发,必须走k步。最后落在(x,y)上的方法数有多少种?的更多相关文章

  1. 一个n*n 的方格,要从左上角走到右下角,一次只能往右或往下走一步,求算法得出所有走动的方法数。

    题目一:一个n*n 的方格,要从左上角走到右下角,一次只能往右或往下走一步,求算法得出所有走动的方法数. 分析:对于第(i,j)个格子,只有向右走一步到达或者向左走一步到达,dp(i,j) = d(i ...

  2. oracle笔记--查询10条之后记录的数据

    本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 由于之前一直在用mysql 对于oracle 的一些语法不太了解,自己有一次去面试让写一个oracle ...

  3. 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。

    /** 题目:Lost in WHU 链接:https://oj.ejq.me/problem/26 题意:一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开. ...

  4. 迭代器-迭代对象-dir(a)可以查看该数据类型有多少种方法。range(10)在py3里就是一个迭代器,for循环实际就是迭代器的应用

    迭代器 我们已经知道,可以直接作用于for循环的数据烈性有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str,bytes等: 一类是generator,数据结构,包括生成 ...

  5. C - Aladdin and the Flying Carpet 有多少种长方形满足面积为a(<=10^12),且最短边>=b;长方形边长为整数,且一定不可以是正方形。

    /** 题目:C - Aladdin and the Flying Carpet 链接:https://vjudge.net/contest/154246#problem/C 题意:有多少种长方形满足 ...

  6. 有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完?

    有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完? 相关问题: (1)有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台 ...

  7. 解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据

    我们都知道,各种主流的社交应用或者阅读应用,基本都有列表类视图,并且都有滑到底部加载更多这一功能, 对应后端就是分页拉取数据.好处不言而喻,一般来说,这些数据项都是按时间倒序排列的,用户只关心最新的动 ...

  8. [C# 面试总结]9个点如何画10条线

    问题描述 9个点画10条直线,要求每条直线上至少3个点,相信这道理题目很多朋友在面试的时候都遇到过的(同时自己在面试的时候也遇到过),所以这里记录下来以备复习. 解决方法1:

  9. 自己制作一个链表用来存储列表信息,并查找当前id信息,找上一条信息,下一条信息(信息浏览的时候方便使用)

    偶然看到某些网站在新闻详情中 ,往往是需要根据当前信息id获取到上一条信息和下一条信息的,而通常我们的做法是先获取当前信息,再获取上一条信息,再获取下一条信息,就需要发送三次查询才能够得到这些信息,一 ...

  10. node--处理一个增加上传操作和渲染页数条

    一段学习的结束 我也不知道我这是在写些什么,只是觉得学完了一些东西,就是想把它记录 一下,这样我就可以知道我是学过这一块的,要多激励自己,^^O(∩∩)O哈哈~ 以下内容并不完全与标题匹配,不过以下内 ...

随机推荐

  1. 【BUUCTF】强网杯 2019随便注1 write up

    输入万能密码1' or 1=1# ,判断存在sql注入, SQL注入的万能密码实际上是利用了网址后台的漏洞,打开下面的网址不用密码和账号也可以登录后台. 万能密码原理: 万能密码能够绕过sql检测,在 ...

  2. docker学习3

    docker的启动流程 docker run -t -i <name:tag> /bin/bash -t 把1个伪终端绑定到容器的标准输入 -i 保持容器的标准输入始终打开不关闭 启动流程 ...

  3. getopts解析shell脚本命令行参数

    getopts命令格式 getopts optstring name [arg] optstring为所有可匹配选项组成的字符串,每个字母代表一个选项.如果字母后有冒号:,表明该选项需要选择参数.比如 ...

  4. Android studio软件的安装过程详解

    步骤详解 进入官网,下载相关软件 官网地址:https://developer.android.google.cn/studio/ 点击该页面里面的这个按钮,就能够很轻松地完成下载操作: 弹出弹窗,继 ...

  5. 基于声网 Flat 构建白板插件应用“成语解谜”的最佳实践

    前言 本文作者赵杭天.他参加了"2022 RTE 编程挑战赛"--"赛道二 场景化白板插件应用开发" , 并凭借作品"成语解谜"获得了该赛道 ...

  6. ElasticSearch的常用API

    ElasticSearch的常用API 1.在服务器上怎么查ES的信息 # 通过使用_cat可以查看支持的命令 ### curl localhost:9200/_cat eg: /_cat/alloc ...

  7. 刷爆 LeetCode 双周赛 100,单方面宣布第一题最难

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 上周末是 LeetCode 第 100 场双周赛,你参加了吗?这场周赛整体没有 Hard ...

  8. Linux的优缺点

    作为一个Archlinux用户, 断然是不会认为Linux有缺点的, 任何所谓的缺点都是自己技艺不精或者没有好好利用搜索引擎而造成的狭隘偏见. 但是假如是一位习惯于视窗系统的新手而言, 假如他上手的是 ...

  9. day01-SpringCloud基本介绍

    SpringCloud基本介绍 SpringCloud官方文档 1.提出问题 先思考一个问题,没有微服务技术,是不是程序员就不能开发大型项目? 是可以的,对大型项目进行模块划分,对各个模块进行实现.但 ...

  10. day02-搭建微服务基础环境01

    搭建微服务基础环境01 1.创建父工程,用于聚合其他微服务模块 1.1创建父项目 说明:我们先创建一个父项目,该父项目会去管理多个微服务模块(module),如下: (1)File-New-Proje ...