DP骑士游历
2016-03-19 20:59
363 查看
题目描述
设有一个n*m的棋盘(2≤n≤50,2≤m≤50),如下图,在棋盘上有一个中国象棋马。规定:
1. 马只能走日字
2. 马只能向右跳
问给定起点x1,y1和终点x2,y2,求出马从x1,y1出发到x2,y2的合法路径条数。
输入描述
第一行2个整数n和m第二行4个整数x1,y1,x2,y2
输出描述
一个整数,表示方案数C++
一个非常简单的DP问题,但是要注意哪个是横坐标,哪个是纵坐标,如何遍历。
不要在一个语句中多次调用同一个子函数。
数据量,保险起见unsigned long long。
坑死我了……
#include <iostream> #define MAX 50 using namespace std; int m, n; // 棋盘尺寸 int xs, ys, xe, ye; // 起点终点坐标 unsigned long long dp[MAX + 1][MAX + 1]; bool inChess(int a, int b) { if (a > 0 && a <= m && b > 0 && b <= n) return true; return false; } int main() { cin >> n >> m; cin >> xs >> ys >> xe >> ye; // 做这道题的时候先输入的是列,下面换一下就成 for (int i = 0; i <= m; i++) for (int j = 0; j <= n; j++) dp[i][j] = 0; dp[ys][xs] = 1; // 标记起点 // 马只能向右跳,先遍历列 for (int j = 1; j <= n; j++) { if (j > xe) { break; } // 终点往右不需计算了 for (int i = 1; i <= m; i++) { dp[i][j] += inChess(i + 2, j - 1) ? dp[i + 2][j - 1] : 0; dp[i][j] += inChess(i - 2, j - 1) ? dp[i - 2][j - 1] : 0; dp[i][j] += inChess(i - 1, j - 2) ? dp[i - 1][j - 2] : 0; dp[i][j] += inChess(i + 1, j - 2) ? dp[i + 1][j - 2] : 0; } } cout << dp[ye][xe] << endl; // 输出终点 system("pause"); return 0; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua和C语言的交互详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法