【NOIP1997】骑士游历

来源:互联网 发布:常用排序算法 编辑:程序博客网 时间:2024/05/16 06:32

【codevs 1219】
1219 骑士游历 1997年
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
设有一个n*m的棋盘(2≤n≤50,2≤m≤50),如下图,在棋盘上有一个中国象棋马。

规定:

1)马只能走日字

2)马只能向右跳

问给定起点x1,y1和终点x2,y2,求出马从x1,y1出发到x2,y2的合法路径条数。
这里写图片描述

输入描述 Input Description
第一行2个整数n和m

第二行4个整数x1,y1,x2,y2

输出描述 Output Description
输出方案数

样例输入 Sample Input
30 30

1 15 3 15

样例输出 Sample Output
2

数据范围及提示 Data Size & Hint
2<=n,m<=50

简单的棋盘DP 分类是这么说的
然而更像递推……

类似于过河卒
只能向右走也就是只能由左边转移而来
那就从起点开始转移
╮(╯_╰)╭讲完了

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 105;int n,m,x1,y1,x2,y2;long long num[MAXN][MAXN];long long ans = 0;int main(){    memset(num,0,sizeof(num));    scanf("%d %d",&n,&m);    scanf("%d %d %d %d",&x1,&y1,&x2,&y2);//起点终点    num[y1][x1] = 1;    for(int i = x1; i <= x2; i ++)    {        for(int j = 1; j <= m; j ++)        {            if(!num[j][i])  continue;            //之前的状态无法到达那么当前状态也无法到达            //四个状态转移            num[j + 1][i + 2] += num[j][i];            num[j + 2][i + 1] += num[j][i];            num[j - 1][i + 2] += num[j][i];            num[j - 2][i + 1] += num[j][i];        }    }    ans = num[y2][x2];    printf("%lld\n",ans);    return 0;}
0 0
原创粉丝点击