DP骑士游历
来源:互联网 发布:软件ui界面设计 编辑:程序博客网 时间:2024/04/26 06:05
题目描述
设有一个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 50using 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;}
0 0
- DP骑士游历
- ACM 1219 骑士游历(dp)
- codevs1219 骑士游历 棋盘型DP
- code(vs)1219 骑士游历 (棋盘dp)
- codevs 1219 骑士游历 DP 解题报告
- 骑士游历
- 骑士游历
- 骑士游历
- 骑士游历
- CodeVS1219 骑士游历 解题报告【棋盘型DP】
- 骑士游历问题
- ZJNU 1006 骑士游历
- 骑士游历问题
- UVA 439 骑士游历
- poj 2488 骑士游历
- wikioi p1219 骑士游历
- wikioi 1219 骑士游历
- POJ2488 骑士游历(DFS)
- ShareSDK第三方分享与登录遇到的问题
- Android 图片加载相关问题
- 内存的分类
- Linux 常用网络命令介绍
- 有一个单项的链表,在没有头结点的情况下,只知道有一个指向结点B的指针p,假设这个结点B不是尾结点,删除该节点B。
- DP骑士游历
- ## JDK源码--ArrayList
- Qt学习之QListWidget添加Item
- 初识MVC
- MIDle生命周期详解,以及工作原理
- Git的使用小结
- RxJava入门学习笔记
- USB固件开发keil C51 Error: User Command terminated, Exit-Code = 1
- 基于光学导航系统,矩阵变换和3D-2D配准研究