您的位置:首页 > 编程语言 > C语言/C++

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语言 算法