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问题,但是要注意

  1. 哪个是横坐标,哪个是纵坐标,如何遍历。
  2. 不要在一个语句中多次调用同一个子函数。
  3. 数据量,保险起见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
原创粉丝点击