当前位置:网站首页>暴力递归到动态规划 08(小马走象棋)
暴力递归到动态规划 08(小马走象棋)
2022-08-03 00:26:00 【涛涛英语学不进去】

递归思路
考虑马儿的所有行程点,越界则不计入。
public int ways(int a, int b, int step) {
System.out.println(jump(a, b, 0, 0, step));
return process(a, b, 0, 0, step);
}
/** * @param a 目标位置x * @param b 目标位置y * @param i 当前位置i * @param j 当前位置j * @param step 剩余步数 step * @return 横9线,纵10线 * 9行10列 * [0-8] [0-9] */
private int jump(int a, int b, int i, int j, int step) {
if (step == 0) {
//当前是一种方法
return a == i && b == j ? 1 : 0;
}
// i j 跳跃情况:i+1,j+2 i+2,j+1 i-1,j+2 i-2,j+1 i+1,j-2 i+2,j-1
int upRightDown = i + 1 <= 9 && j + 2 <= 8 ? jump(a, b, i + 1, j + 2, step - 1) : 0;
int upRightUp = i + 2 <= 9 && j + 1 <= 8 ? jump(a, b, i + 2, j + 1, step - 1) : 0;
// i-2,j+1 i-2,j-1
int upLeftDown = i - 2 >= 0 && j + 1 <= 8 ? jump(a, b, i - 2, j + 1, step - 1) : 0;
int upLeftUp = i - 1 >= 0 && j + 2 <= 8 ? jump(a, b, i - 1, j + 2, step - 1) : 0;
// i-1,j-2 i-2,j-1
int downLeftDown = i - 1 >= 0 && j - 2 >= 0 ? jump(a, b, i - 1, j - 2, step - 1) : 0;
int downLeftUp = i - 2 >= 0 && j - 1 >= 0 ? jump(a, b, i - 2, j - 1, step - 1) : 0;
// i+1,j-2 i+2,j-1
int downRightDown = i + 1 <= 9 && j - 2 >= 0 ? jump(a, b, i + 1, j - 2, step - 1) : 0;
int downRightUp = i + 2 <= 9 && j - 1 >= 0 ? jump(a, b, i + 2, j - 1, step - 1) : 0;
return upRightDown + upRightUp + upLeftDown + upLeftUp + downLeftDown + downLeftUp + downRightDown + downRightUp;
}
简化
private int process(int a, int b, int i, int j, int step) {
if (i > 9 || j > 8 || i < 0 || j < 0) {
return 0;
}
if (step == 0) {
//当前是一种方法
return a == i && b == j ? 1 : 0;
}
// i j 跳跃情况:i+1,j+2 i+2,j+1 i-1,j+2 i-2,j+1 i+1,j-2 i+2,j-1
int ways = process(a, b, i + 1, j + 2, step - 1);
ways += process(a, b, i + 2, j + 1, step - 1);
// i-2,j+1 i-2,j-1
ways += process(a, b, i - 2, j + 1, step - 1);
ways += process(a, b, i - 1, j + 2, step - 1);
// i-1,j-2 i-2,j-1
ways += process(a, b, i - 1, j - 2, step - 1);
ways += process(a, b, i - 2, j - 1, step - 1);
// i+1,j-2 i+2,j-1
ways += process(a, b, i + 1, j - 2, step - 1);
ways += process(a, b, i + 2, j - 1, step - 1);
return ways;
}
动态规划
public int dp(int a, int b, int k) {
int[][][] dp = new int[10][9][k + 1];
//第一层填好
dp[a][b][0] = 1;
for (int step = 1; step <=k; step++) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 9; j++) {
// i j 跳跃情况:i+1,j+2 i+2,j+1 i-1,j+2 i-2,j+1 i+1,j-2 i+2,j-1
int upRightDown = i + 1 <= 9 && j + 2 <= 8 ? dp[i + 1][j + 2][step - 1] : 0;
int upRightUp = i + 2 <= 9 && j + 1 <= 8 ? dp[i + 2][j + 1][step - 1] : 0;
// i-2,j+1 i-2,j-1
int upLeftDown = i - 2 >= 0 && j + 1 <= 8 ? dp[i - 2][j + 1][step - 1] : 0;
int upLeftUp = i - 1 >= 0 && j + 2 <= 8 ? dp[i - 1][j + 2][step - 1] : 0;
// i-1,j-2 i-2,j-1
int downLeftDown = i - 1 >= 0 && j - 2 >= 0 ? dp[i - 1][j - 2][step - 1] : 0;
int downLeftUp = i - 2 >= 0 && j - 1 >= 0 ? dp[i - 2][j - 1][step - 1] : 0;
// i+1,j-2 i+2,j-1
int downRightDown = i + 1 <= 9 && j - 2 >= 0 ? dp[i + 1][j - 2][step - 1] : 0;
int downRightUp = i + 2 <= 9 && j - 1 >= 0 ? dp[i + 2][j - 1][step - 1] : 0;
dp[i][j][step] = upRightDown + upRightUp + upLeftDown + upLeftUp + downLeftDown + downLeftUp + downRightDown + downRightUp;
}
}
}
return dp[0][0][k];
}
边栏推荐
- 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
- 2022年8月2日——使用idea搭建servlet+jsp项目
- 中科磁业IPO过会:年营收5.5亿 吴中平家族持股85%
- 优秀论文以及思路分析02
- Carefully organize 16 MySQL usage specifications to reduce problems by 80% and recommend sharing with the team
- 2022 Shandong International Youth Eye Health Industry Exhibition, Vision Health Exhibition, Optometry Exhibition
- DB2数据库-获取表结构异常:[jcc][t4][1065][12306][4.26.14]CharConvertionException ERRORCODE=-4220,SQLSTATE=null
- NLP commonly used Backbone model cheat sheet (1)
- 30岁测试开发年薪不足80万,还要被面试官diss混得太差?
- 从一文中了解SSRF的各种绕过姿势及攻击思路
猜你喜欢

vue3的keepAlive缓存组件

从一文中了解SSRF的各种绕过姿势及攻击思路

npm运行项目dependencies were not found: core-js/modules/es6.array.fill

【TypeScript笔记】01 - TS初体验 && TS常用类型

为了面试阿里,熬夜肝完这份软件测试笔记后,Offer终于到手了

基于rt-thread studio的STM32裸机开发——LED

全栈---Proxy

fifa将采用半自动越位技术计算进球

【图像分类】2021-EfficientNetV2 CVPR

图文详细解决IDEA使用Debug模式启动项目一直转圈圈跑起不来(亲测可以)
随机推荐
php提示Array to string conversion
DB2数据库-获取表结构异常:[jcc][t4][1065][12306][4.26.14]CharConvertionException ERRORCODE=-4220,SQLSTATE=null
流程控制for和while循环语句
vue3的keepAlive缓存组件
「PHP基础知识」隐式数据类型
风电场运营实践 | 麒麟信安助力国华投资山东公司集控中心实现安全智慧化运营
心电记录电路设计(框图/波形以及信号放大器的选择)
【多线程】线程与进程、以及线程进程的调度
esp32和ros2基础篇草稿-micro-ros-
【多线程】Thread类的基本用法
【飞控开发高级教程1】疯壳·开源编队无人机-飞控整机代码走读、编译与烧写
有奖提问|《新程序员》专访“Apache之父”Brian Behlendorf
Vite教程 安装
C# 异步编程(async和await)
谷歌 Chrome 浏览器 104 正式版发布:加快网页加载,蓝牙 API 改进
增删改查这么多年,最后栽在MySQL的架构设计上!
科捷智能冲刺科创板:年营收12.8亿 顺丰与日日顺是股东
【MySQL —— 数据库约束】
UE5 官方案例Lyra 全特性详解 8.如何用配置表初始化角色数据
1686. 石子游戏 VI