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. SQL 抽象语法树及改写场景应用

    SQL 抽象语法树及改写场景应用 1 背景 我们平时会写各种各样或简单或复杂的 sql 语句,提交后就会得到我们想要的结果集.比如 sql 语句,"select * from t_user ...

  2. layui使用OSS上传

    1.首先要把aliyun-oss-sdk.js包下载下来,放到指定的目录下面  在要用的页面引入或者在index.html入口文件全局引入: <script src="util/ali ...

  3. keras图片数字识别入门AI机器学习

    通过使用mnist(AI界的helloworld)手写数字模型训练集,了解下AI工作的基本流程. 本例子,要基于mnist数据集(该数据集包含了[0-9]的模型训练数据集和测试数据集)来完成一个手写数 ...

  4. 继续Vue的探索

    接上集 上次到了想要利用Vue实现隔行变色的请求,但是由于使用的代码过于"高级"导致无法识别,这就需要利用webpack来解决它! webpack的基本使用 1.首先,在项目中安装 ...

  5. 02.SQL

    1. SQL通用语法 SQL语句可以单行或者多行书写,以分号结尾 SQL语句可以使用空格或者缩进来增强语句的可读性 MYSQL数据库的SQL语句不区分大小写,关键字建议使用大写 注释: 单行注释:-- ...

  6. Linux & 标准C语言学习 <DAY11>

    一.指针     1.什么是指针         指针是一种特殊的数据类型,使用指针可以定义指针变量,指针变量存储的是整形数据,该数据代表了内存的编号(地址),可以通过这个编号访问到对应的内存     ...

  7. 简单入门echart方法

    图表用echart, 然后前端的 HTML 跟 nodejs  , nodejs 去调用 后端PHP的接口 链接:https://www.jianshu.com/p/1f2c37c5c02f 官网:h ...

  8. 快速使用ChatGpt Web Server

    快速使用ChatGpt Web Server ChatGpt Web Server是使用Blazor Server模式部署的一个服务,所有的逻辑和代码执行都会在服务器执行,然后通过SignalR传输到 ...

  9. list Api

    类型 名称 void add(String item)将指定的项目添加到滚动列表的末尾. void add(String item, int index)将指定的项目添加到由索引指示的位置的滚动列表中 ...

  10. [Windows/Linux]Linux下的正斜杠"/"和"\"的区别 [转载]

    执行某一条Linux命令时,遇到了此问题,甚为不解.[文由] 本篇属于全文转载自: Linux下的正斜杠"/"和""的区别 - 博客园 >>> ...